有没有办法在LINQ中设置值?

时间:2011-10-20 15:34:44

标签: c# linq

使用LINQ进行这些分配有更好的方法吗?

IEnumerable<SideBarUnit> sulist1 = newlist.Where(c => c.StatusID == EmergencyCV.ID);
foreach (SideBarUnit su in sulist1) su.color = "Red";

6 个答案:

答案 0 :(得分:8)

没有

你可以做这样的事情,正如其他答案所指出的那样,但是你不再使用LINQ

Eric Lippert写了an excellent blog post about this very subject,我强烈建议你阅读。这是一段摘录:

  

哲学上反对提供这样的方法,原因有两个。

     

第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则。显然调用此方法的唯一目的是引起副作用。

     

表达式的目的是计算一个值,而不是引起副作用。

     

...

     

第二个原因是这样做会增加语言的新代表性能力。这样做可以让你重写这个非常清晰的代码:

foreach(Foo foo in foos){ statement involving foo; }
     

进入此代码:

foos.ForEach((Foo foo)=>{ statement involving foo; });
     

使用几乎完全相同的字符,顺序略有不同。然而第二个版本更难理解,更难调试,并引入了闭包语义,从而可能以微妙的方式改变对象的生命周期。

答案 1 :(得分:4)

最简单的方法是定义一个foreach扩展方法,允许您将其添加到此类查询的末尾。例如

public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action) {
  foreach (var cur in enumerable) {
    action(cur);
  }
}

...

用法:

newlist
  .Where(c => c.StatusID == EmergencyCV.ID)
  .ForEach(cur => cur.color = "Red");

答案 2 :(得分:4)

使用List.ForEach()方法:

IEnumerable<SideBarUnit> sulist1 = 
   newlist.Where(c => c.StatusID == EmergencyCV.ID)
          .ToList()
          .ForEach(item => item.color = "Red");

PS:我知道Eric Lippert的article aboout ForEach() vs foreach,但无论如何它是有用的,我更喜欢它而不是for/foreach循环

编辑:关于效果点击的评论中的问题

Enumerable.ToList()已实施为

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    return new List<TSource>(source);
}

所以性能上升是创建新List<>()实例的时间。

MSDN接下来代表List<>(IEnumerable<>) ctor:

  

初始化包含元素的List类的新实例   从指定的集合中复制,并且具有足够的容量来容纳复制的元素数量。

因此会有所有列表的复制操作

答案 3 :(得分:4)

Linq就是选择而不是更新。 但您可以使用ToList和List的ForEach来更新元素:

newlist.Where(c => c.StatusID == EmergencyCV.ID).
  ToList().
  ForEach(su => su.color = "Red");

我不确定可读性是否更好......

答案 4 :(得分:2)

LINQs的目的主要是查询/项目/转换数据。

您可能希望使用ForEach扩展方法。但请参阅this discussion了解更多详情。

答案 5 :(得分:1)

您可以在Select语句中使用匿名方法:

var sulist1 = newlist.Where(c => c.StatusID == EmergencyCV.ID)
                     .Select(c => {
                                     c.color = "Red";
                                     return c;
                                  });