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

C# 使用linq更改数组中的一个字段,c#,linq,C#,Linq,我有一个对象数组,其中一个字段是名为includeInReport的布尔字段。在某种情况下,我希望默认为始终为真。我知道这样做很简单: foreach (var item in awards) { item.IncludeInReport = true; } 但是有没有一种与linq相同的方法来实现这一点?这更能满足我的好奇心,而不是任何东西。。。我的第一个想法是这样做 awards.Select(a => new Award{ IncludeInReport = true, S

我有一个对象数组,其中一个字段是名为includeInReport的布尔字段。在某种情况下,我希望默认为始终为真。我知道这样做很简单:

foreach (var item in awards)
{
    item.IncludeInReport = true;
}
但是有没有一种与linq相同的方法来实现这一点?这更能满足我的好奇心,而不是任何东西。。。我的第一个想法是这样做

awards.Select(a => new Award{ IncludeInReport = true, SomeFiled = a.SomeField, .... }

但由于我的对象中有几个字段,我不想把所有字段都打印出来,而此时屏幕上就乱七八糟了。谢谢

ForEach有点像linq:

awards.ForEach(item => item.IncludeInReport = true);
但是Linq不是关于更新值的。因此,您没有使用正确的工具



让我来量化“某种linq”。ForEach不是Linq,而是
列表
上的一个方法。但是,语法与Linq类似。

您可以这样做:

awards.AsParallel().ForAll(item => item.IncludeInReport = true)

如果可能的话,这将使该操作并行。

Linq中没有可用的突变方法。Linq对于查询、排序、过滤、连接和投影数据非常有用。如果需要对其进行变异,您已经有了一种非常干净、清晰的方法:您的循环


List
公开了一个
ForEach
方法来编写提醒您Linq(但不是)的内容。然后,您可以提供一个
操作
或其他一些委托/函数,将您的变异依次应用于每个元素。(Ahmed Mageed还提到了略微不同的
Array.ForEach
方法。)您可以编写自己的扩展方法来对
IEnumerable
执行相同的操作(这通常比上述任何一种方法都更适用,也适用于您的数组)。但我建议您只保留循环,它并不完全脏。

因为您是从阵列开始的,所以可以使用:


这不是LINQ,但在这种情况下,您不需要LINQ。正如其他人提到的,您不能通过LINQ对项目进行变异。如果你有一个
列表
,你可以用类似的方式。Eric Lippert在这里更深入地讨论了这个问题:。

以下是正确的代码:

awards = awards.Select(a => {a.IncludeInReport = true; return a;});
LINQ遵循函数式编程思想,因此不希望您更改(变异)现有变量


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

ForEach
是在
List
中实现的一种方法,因此只有当奖励是
列表时,它才会起作用?当然。ForEach可能不是“纯”的,但它能满足op的需求。只需先执行一个.ToList().List.ForEach,正如下面其他人所指出的那样,它通常会受到冷嘲热讽。下面还有一篇很好的文章对此进行了探讨:
awards = awards.Select(a => {a.IncludeInReport = true; return a;});