我有一个对象数组,其中一个字段是一个名为includeInReport的布尔字段。在某种情况下,我想默认它始终为真。我知道这就像这样容易:
foreach (var item in awards)
{
item.IncludeInReport = true;
}
但使用linq有没有一种平等的方法呢?这更像是为了满足我的好奇心......我的第一个想法是做到这一点......
awards.Select(a => new Award{ IncludeInReport = true, SomeFiled = a.SomeField, .... }
但是因为我的对象中有一些字段,所以我不想输入所有字段,而且此时屏幕上只是杂乱无章。谢谢!
答案 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)
如果可能的话,这会使行动平行。