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

时间:2012-02-20 21:41:22

标签: c# linq

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

foreach (var item in awards)
{
    item.IncludeInReport = true;
}

但使用linq有没有一种平等的方法呢?这更像是为了满足我的好奇心......我的第一个想法是做到这一点......

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

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

5 个答案:

答案 0 :(得分:9)

ForEach有点像linq:

awards.ForEach(item => item.IncludeInReport = true);

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

<小时/> 让我量化“种类的linq”。 ForEach Linq,但是List<T>上的方法。但是,语法类似于Linq。

答案 1 :(得分:5)

由于您是从数组开始的,因此可以使用Array.ForEach method

Array.ForEach(awards, a => a.IncludeInReport = true);

这不是LINQ,但在这种情况下,您不需要LINQ。正如其他人所提到的,你不能通过LINQ改变项目。如果您有List<T>,则可以以类似的方式使用its ForEach method。 Eric Lippert在这里更深入地讨论了这个问题:"foreach" vs "ForEach"

答案 2 :(得分:2)

Linq没有变异方法。 Linq对于查询,排序,过滤,连接和投影数据非常有用。如果你需要改变它,你已经有一个非常干净,清晰的方法:你的循环。

List<T>公开了一个ForEach方法来写一些提醒你Linq(但不是)的方法。然后,您可以提供Action<T>或其他一些委托/函数,依次将您的变异应用于每个元素。 (Ahmed Mageed的answer也提到了稍微不同的Array.ForEach方法。)您可以编写自己的扩展方法来对IEnumerable<T>执行相同的操作(这通常比上述方法更适用)并且也适用于您的阵列)。但我鼓励你简单地保持你的循环,它并不完全是脏的。

答案 3 :(得分:2)

这里有正确的代码:

awards = awards.Select(a => {a.IncludeInReport = true; return a;});

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

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

答案 4 :(得分:0)

你可以这样做:

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

如果可能的话,这会使行动平行。