gpt4 book ai didi

c# - 比 .ToArray() 更好的东西来强制枚举 LINQ 输出

转载 作者:可可西里 更新时间:2023-11-01 08:02:52 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com