gpt4 book ai didi

c# - LINQ,简化表达式 - take while take of sum of taken does not exceed given value

转载 作者:可可西里 更新时间:2023-11-01 07:50:41 27 4
gpt4 key购买 nike

给定这样的设置..

class Product {
int Cost;
// other properties unimportant
}

var products = new List<Product> {
new Product { Cost = 5 },
new Product { Cost = 10 },
new Product { Cost = 15 },
new Product { Cost = 20 }
};

var credit = 15;

假设列表将按照给定的顺序排序。我希望基本上遍历列表中的每个项目,保留成本的总和,并在总成本 不超过 credit 的情况下继续推出产品。

我可以用一些循环和东西来做到这一点,但我想知道是否有办法将它压缩成一个更简单的 LINQ 查询。

最佳答案

其他人指出了捕获变量的方法,并且可以说是正确的观点认为这种方法不好,因为它会改变状态。此外,捕获的变量方法只能迭代一次,并且很危险,因为 a.你可能会忘记这个事实并尝试迭代两次; b.捕获的变量不反射(reflect)所取项目的总和。

为了避免这些问题,只需创建一个扩展方法:

public static IEnumerable<TSource> TakeWhileAggregate<TSource, TAccumulate>(
this IEnumerable<TSource> source,
TAccumulate seed,
Func<TAccumulate, TSource, TAccumulate> func,
Func<TAccumulate, bool> predicate
) {
TAccumulate accumulator = seed;
foreach (TSource item in source) {
accumulator = func(accumulator, item);
if (predicate(accumulator)) {
yield return item;
}
else {
yield break;
}
}
}

用法:

var taken = products.TakeWhileAggregate(
0,
(cost, product) => cost + product.Cost,
cost => cost <= credit
);

请注意,现在您可以迭代两次(但如果您的 TAccumulate 是可变引用类型,请小心)。

关于c# - LINQ,简化表达式 - take while take of sum of taken does not exceed given value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7402393/

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