LINQ中是否存在可返回序列的foreach以支持中途修改并续查?
解决方案
当然可以在同一段LINQ查询中实现这个需求,你可以利用Select操作在投影过程中完成对b.Flag的修改,同时返回原b对象以继续后续的查询链:
a.SelectMany(a => a.B) .Where(b => b.cList.All(c => !c.IsSelected)) .Select(b => { b.Flag = true; // 在这里修改Flag属性 return b; // 返回b以继续后续操作 }) .SelectMany(b => b.cList) .ForEach(c => c.IsSelected = true);
说明
Select操作在这里的作用不只是投影,还附带了修改b.Flag的副作用。虽然LINQ的设计初衷是无副作用的查询操作,但这种写法确实能满足你在查询链中修改元素并继续后续操作的需求。- 如果你担心这种写法不够“纯粹”,也可以拆分两步:先筛选出符合条件的
b集合,修改它们的Flag,再处理对应的cList,但上述链式写法更紧凑。
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

