我正在使用LINQ to objects并且有一个函数,在某些情况下我需要在调用之前修改底层集合Aggregate(...)
,然后在函数返回结果之前将其返回到其原始状态Aggregate(...)
.我当前的代码看起来像这样:
bool collectionModified = false; if(collectionNeedsModification) { modifyCollection(); collectionModified = true; } var aggregationResult = from a in (from b in collection where b.SatisfysCondition) .Aggregate(aggregationFunction) select a.NeededValue; if(collectionModified) modifyCollection(); return aggregationResult;
但是,如上所述,如果我修改了集合,我将得到错误的结果,因为我在aggregationResult
枚举之前将集合恢复到其原始状态,并且LINQ结果是惰性评估的.我目前的解决方案是使用.ToArray()
我的LINQ查询,如下所示:
var aggregationResult = (from a in (from b in collection where b.SatisfysCondition) .Aggregate(aggregationFunction) select a.NeededValue).ToArray();
结果数组的大小总是很小(<100项),因此内存/处理时间不是问题.这是处理我的问题的最佳方法,还是有更好的方法来强制评估LINQ查询?
只是为了检查我理解你 - 你基本上想要遍历所有的结果,只是为了强制发生任何副作用?
副作用通常是一个坏主意,因为这种逻辑更难理解.话虽如此,最简单的方法并强制进行全面评估可能只是迭代它:
foreach (var result in aggregationResult) { // Deliberately empty; simply forcing evaluation of the sequence. }
或者,您可以使用LastOrDefault()来避免ToArray()中涉及的所有复制.只要结果没有实现(包括快捷方式),Count()就可以IList
了.
(注意:在没有编译器的情况下键入,因此代码未经测试)
如果您已将.NET的Reactive Extensions作为依赖项,则可以使用Run():
aggregationResult.Run();
但是可能不值得为此添加依赖项.
您也可以自己实现Run方法作为扩展方法:
public static MyLinqExtensions { public static void Run(this IEnumerable e) { foreach (var _ in e); } }