作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 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 结果被延迟计算之前的原始状态.我当前的解决方案是在我的 LINQ 查询中使用 .ToArray()
,如下所示:
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<T>
(这涉及到捷径)。
关于c# - 比 .ToArray() 更好的东西来强制枚举 LINQ 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/314100/
我是一名优秀的程序员,十分优秀!