2015-02-09 32 views
-2

我有對象的名單,我想替換的對象之一與新對象名單:如何更新列表C#中的整個對象?

public Parent AppendParentChildren(Request request) 
    { 
     var Children = request.Parent.Children.ToList(); 
     if (Children.Any(x => x.TrackingNumber == request.Child.TrackingNumber)) 
     { 
      //Here I want to replace any Children that have the same tracking number in the list with the new Child passed in 
     } 
     else 
     { 
      Children.Add(request.Child); 
     } 
     request.Parent.Children = Children; 
     return request.Parent; 
    } 

public class Request 
{ 
    public Parent Parent { get; set; } 
    public Child Child { get; set; } 

} 

public class Parent 
{ 
    public IEnumerable<Child> Children {get;set;} 
} 

如果我嘗試在一個循環中使用它:

public static class Extension 
{ 
    public static void Update<T>(this List<T> items, T newItem) 
    { 
     foreach (var item in items) 
     { 
     //this 
      item = newItem; 
     } 
    } 
} 

項目是隻讀的,所以我不能替換列表中的對象。

有什麼建議嗎?

+3

您是否聽說過_loops_? – 2015-02-09 16:45:37

+0

我不明白你在做什麼,對不起。你能編輯你的文章並澄清嗎? – 2015-02-09 16:48:07

+0

您確定要用相同的對象替換具有相同跟蹤編號的多個對象嗎?您將在該列表中將對象複製到您的列表中。 – 2015-02-09 16:50:42

回答

0

您不能更改foreach迭代的成員,因爲foreach實現了只讀的IEnumerable類型。 解決方法是將擴展方法內的項目列表轉換爲List(可讀寫)。然後,您需要確定要替換的列表中的哪些項目並更新它們。下面是更新擴展方法是什麼樣子(假設你在一個情況下,你可以使用LINQ是)上dotnetfiddle https://dotnetfiddle.net/MJ5svP

public static class Extension 
{ 
    public static void Update<T>(this List<T> items, T newItem) 
    { 
     var childList = items as List<Child>; 
     var newChildItem = newItem as Child; 
     var matches = childList.Where(x => x.TrackingNumber == newChildItem.TrackingNumber).ToList(); 
     matches.ForEach(x => childList[childList.IndexOf(x)] = newChildItem); 
    } 
} 

我已經把工作的例子(儘管略顯臃腫)

同樣值得注意的是,雖然看起來你正在改變childList,但實際上這是參考原始列表而不是創建副本(關於此更多信息,請參閱here