LINQ中是否存在返回序列而不是完成LINQ查询的foreach?

flseospp  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(132)

我有一个查询,在此期间我想修改我的项目并继续查询。

a.SelectMany(a => a.B)
    .Where(b => b.cList.All(c => !c.IsSelected))
    //I want to run foreach between those lines to set flag on b=>b.Flag = true
    .SelectMany(b => b.cList)
.ForEach(c =>  c.IsSelected = true;);

问题是我想修改我的b并继续进一步的投影。这在一个LINQ查询中可以实现吗?

9rbhqvlz

9rbhqvlz1#

你可以做一些有副作用的预测。这通常不是一个好主意(因为LINQ被设计成功能更强大),但是很容易做到:

a.SelectMany(a => a.B)
 .Where(b => b.cList.All(c => !c.IsSelected))
 .Select(b => { b.Flag = true; return b; }) 
 .SelectMany(b => b.cList)
 .ForEach(c => c.IsSelected = true);

或者您可以编写自己的扩展方法来使它更清楚:

public static IEnumerable<T> ExecuteSideEffect(
    this IEnumerable<T> sequence, Action<T> action) =>
    sequence.Select(item => { action(item); return item; });
...

// Use the extension method
a.SelectMany(a => a.B)
 .Where(b => b.cList.All(c => !c.IsSelected))
 .ExecuteSideEffect(b => b.Flag = true) 
 .SelectMany(b => b.cList)
 .ForEach(c => c.IsSelected = true);
xeufq47z

xeufq47z2#

这个方法也可以工作,但是要小心ToList()方法引起的性能问题。

a.SelectMany(a => a.B)
    .Where(b => b.cList.All(c => !c.IsSelected))
    .ToList()
    .ForEach(b => b.Flag = true);

相关问题