使用linq更改数组中的一个字段

Art*_*510 4 c# linq

我有一个对象数组,其中一个字段是一个名为includeInReport的布尔字段.在某种情况下,我想默认它始终为真.我知道它就像这样简单:

foreach (var item in awards)
{
    item.IncludeInReport = true;
}
Run Code Online (Sandbox Code Playgroud)

但有没有一种平衡的方式来做这个与linq?这更像是为了满足我的好奇心......我的第一个想法是做到这一点......

awards.Select(a => new Award{ IncludeInReport = true, SomeFiled = a.SomeField, .... }
Run Code Online (Sandbox Code Playgroud)

但是因为我的对象中有一些字段,所以我不想输入所有字段,而且此时屏幕上只是杂乱无章.谢谢!

Joe*_*Joe 10

ForEach有点像linq:

awards.ForEach(item => item.IncludeInReport = true);
Run Code Online (Sandbox Code Playgroud)

但Linq不是要更新价值观.所以你没有使用正确的工具.


让我量化"种类的linq".ForEach 不是 Linq,而是一种方法List<T>.但是,语法类似于Linq.

  • `ForEach`是一个在`List`中实现的方法,所以只有在奖励是`List <Award>`时它才会起作用 (2认同)

Ric*_*ard 6

这是正确的代码:

awards = awards.Select(a => {a.IncludeInReport = true; return a;});
Run Code Online (Sandbox Code Playgroud)

LINQ 遵循函数式编程思想,因此不希望您更改(变异)现有变量。

因此,在上面的代码中,我们生成一个新列表(没有更改任何现有值),然后覆盖我们的原始列表(这是在 LINQ 之外,因此我们不再关心函数式编程思想)。


Ahm*_*eed 5

由于从数组开始,因此可以使用Array.ForEach方法

Array.ForEach(awards, a => a.IncludeInReport = true);
Run Code Online (Sandbox Code Playgroud)

这不是LINQ,但是在这种情况下,您不需要LINQ。正如其他人提到的那样,您不能通过LINQ对项目进行突变。如果您有a List<T>,则可以类似的方式使用ForEach方法。埃里克·利珀特(Eric Lippert)在这里更深入地讨论了这个问题: “ foreach”与“ ForEach”