LINQ:转换集合中的项目

时间:2011-10-15 18:53:40

标签: c# .net linq

是否有LINQ方法来修改集合中的项目,例如简单地设置集合中每个项目的属性?像这样:

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

其中,Touch枚举每个项目并应用转换。顺便说一下,我知道SELECT扩展方法,但是这需要我在进行这种转换的类型上公开一个方法并返回相同的引用。

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

其中Item.Transform返回转换并返回相同的实例。

TIA

4 个答案:

答案 0 :(得分:13)

不,标准LINQ中没有允许您修改集合中项目的方法。 LINQ用于查询集合而不是用于引起副作用(例如,改变项目)。 Eric Lippert在他的博客文章中更详细地介绍了这个想法:“foreach” vs “ForEach”

只需使用循环。

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

答案 1 :(得分:2)

LINQ用于查询。如果要修改,请使用简单的循环。只需使用合适的工具即可完成正确的工作。 LINQ对于一切都不是救世主。

答案 2 :(得分:1)

ForEach()上有一个List,因此您可以执行items.ToList().ForEach(i => i.IsActive = false)。您可能希望阅读this

答案 3 :(得分: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)