2011-10-15 75 views
3

是否有LINQ方法來修改集合中的項目,例如簡單地設置集合中每個項目的屬性?類似這樣的:LINQ:轉換集合中的項目

var items = new []{ new Item { IsActive = true } } 
var items = items.Transform(i => i.IsActive = false) 

其中,觸摸枚舉每個項目並應用轉換。順便說一句,我知道的SELECT擴展方法,但這需要我公開一個類型的方法,這種轉換並返回相同的引用。

var items = items.Select(i => i.Transform()) 

其中Item.Transform返回進行轉換並返回相同的實例。

TIA

+0

可能重複http://stackoverflow.com/questions/200574/linq-equivalent -foreach-for-ienumerablet) –

+0

第一個和第二個之間的區別在於第一個實際上改變了集合而另一個返回了新的集合。 – Tetaxa

+0

'var items = items.Select(i => {i.IsActive = false; return i;})' –

回答

1

List上有ForEach(),所以你可以做items.ToList().ForEach(i => i.IsActive = false)。雖然你可能想閱讀this

+0

當我看到人們拿着完美的物品收集並將其轉換爲新的列表,以便他們可以使用該方法時,它讓我感到畏縮...... –

+0

不是LINQ,但這是我在尋找的東西。謝謝。 –

+0

@JeffMercado,我的方法返回IEnumerable 。如果需要,我可以返回List或數組。不,我沒有創建一個僅用於ForEach的新集合。 –

13

不,有標準的LINQ,它允許你修改集合中的項目沒有方法。 LINQ用於查詢集合,而不是導致副作用(例如,變更項目)。 Eric Lippert在他的博客文章中更詳細地介紹了這個想法:「foreach」 vs 「ForEach」

只需使用一個循環。

foreach (var item in items) 
{ 
    item.IsActive = false; 
} 
+0

感謝您的回覆。這就是我最終會做的事情,但我儘管有這樣一種方法,但這是一件常見的事情。 –

+0

@ e28Makaveli請注意,如果您的集合是'List ',那麼您可以使用'ForEach()'方法:'list.ForEach(x => x.Property = value);' – dlev

2

LINQ用於查詢。如果您想修改,請使用簡單的循環。只需使用正確的工具來完成正確的工作。 LINQ並不是所有事情的彌賽亞。

+0

True,true,true,擴展是不是某種轉變?我會說LINQ是用來查詢和枚舉集合。 –

+0

@ e28Makaveli:'Select'用於投影。這與變異或變形不一樣。 – jason

+0

@ e28Makaveli,Select擴展方法返回一個新的IEnumerable,它不會修改您正在嘗試執行的原始操作。它僅用於投影。 –

0

Enumerable類的documentation page on MSDN列出了所有的LINQ方法,不幸的是沒有方法在那裏做你想要的。 LINQ是查詢語言,並不打算修改集合。它在本質上是功能性的,這意味着它不會修改它操作的集合,而是返回一個新的枚舉。

爲了您的目的,最好是簡單地使用foreach循環,或者如果您覺得需要編寫自己的擴展方法來執行您想要的操作,例如。

public static void ForEach<T>(this IEnumerable<T> seq, Action<T> action) 
{ 
    foreach (T item in seq) 
     action(item); 
} 

,你想這可能再被使用:

items.ForEach(i => i.IsActive = false) 
[LINQ等效的foreach爲IEnumerable的 ](的
+0

謝謝。 IList.ForEach做我想要的。 –