2012-01-17 14 views
3

是否有一行LINQ語句會替換下面代碼中的foreach循環?使用LINQ將項目添加到集合屬性有更簡潔的方式嗎?

public static ReplaceItemsOnOrder(Order order, List<OrderItem> replacements) 
{ 
    order.Items.Clear(); 
    foreach (var item in replacements) 
    { 
     order.Items.Add(item); 
    } 
} 

編輯:

下面是Order類簡化的定義:

public class Order 
{ 
    private Collection<OrderItem> _items = new Collection<OrderItem>(); 
    public Collection<OrderItem> Items 
    { 
     get { return _items; } 
    } 
} 
+0

是order.Items什麼東西比ICollection ? – 2012-01-17 12:53:05

+0

檢出http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet – Slugart 2012-01-17 12:53:35

+0

我已更新問題以顯示Order.Items類型,即集合。 – 2012-01-17 13:36:13

回答

2

不,LINQ的是有關選擇,而不是修改。

雖然您可以編寫自己的擴展方法來添加此功能。

3

這不是LINQ但有AddRange

order.Items.AddRange(replacements); 

可是你有沒有說什麼Items是,所以除非是List該方法將不可用。

+0

如果它不是一個List但實現了IEnumerable,他只需要調用.ToList()就可以了,AddRange就可以使用了。 – 2012-01-17 13:01:08

+0

@Baboon:'System.Linq.Enumerable.ToList (這個IEnumerable )'創建一個_new_列表,所有項目引用都被複制,因此爲了這個工作,OP必須將列表存儲在任何地方。 – Nuffin 2012-01-17 13:05:11

+0

@Tobias order.Items.ToList()。AddRange(替換)不要求他將該列表存儲在任何地方,AddRange無效。 – 2012-01-17 13:09:44

2

order.Items a List?你可以有:

public static ReplaceItemsOnOrder(Order order, List<OrderItem> replacements) 
{ 
    order.Items = new List<OrderItem>(replacements); 
} 

這是有道理的,因爲在你的示例代碼,看來你order.Items更換的項目。 List<T>a constructor它接受IEnumerable<T>參數,其內容將被複制到正在構建的列表中。

如果在施工時發生錯誤(包括複製操作),它也不會產生半滿的新列表。

3

你可以寫:

order.Items.Clear(); 
replacements.ForEach(order.Items.Add); 

或者,如果有一個方法的AddRange(上List<T>提供):

order.Items.Clear(); 
order.Items.AddRange(replacements); 
+0

也可以這樣寫:'replacements.ForEach(order.Items.Add);' – 2012-01-17 12:55:43

+1

@KlausByskovHoffmann非常真實,保存不必要的匿名方法。更新。 – 2012-01-17 12:57:49

相關問題