gpt4 book ai didi

c# - 我可以缓存部分执行的 LINQ 查询吗?

转载 作者:太空狗 更新时间:2023-10-29 19:57:20 25 4
gpt4 key购买 nike

我有以下代码:

IEnumerable<KeyValuePair<T, double>> items =
sequence.Select(item => new KeyValuePair<T, double>(item, weight(item)));
if (items.Any(pair => pair.Value<0))
throw new ArgumentException("Item weights cannot be less than zero.");

double sum = items.Sum(pair => pair.Value);
foreach (KeyValuePair<T, double> pair in items) {...}

在哪里weightFunc<T, double> .

问题是我想要weight尽可能少地执行。这意味着它应该对每个项目最多执行一次。我可以通过将它保存到一个数组来实现这一点。但是,如果任何权重返回负值,我不想继续执行。

有什么方法可以在 LINQ 框架内轻松实现这一点?

最佳答案

当然,这完全可行:

public static Func<A, double> ThrowIfNegative<A, double>(this Func<A, double> f)
{
return a=>
{
double r = f(a);
// if r is NaN then this will throw.
if ( !(r >= 0.0) )
throw new Exception();
return r;
};
}

public static Func<A, R> Memoize<A, R>(this Func<A, R> f)
{
var d = new Dictionary<A, R>();
return a=>
{
R r;
if (!d.TryGetValue(a, out r))
{
r = f(a);
d.Add(a, r);
}
return r;
};
}

现在……

Func<T, double> weight = whatever;
weight = weight.ThrowIfNegative().Memoize();

大功告成。

关于c# - 我可以缓存部分执行的 LINQ 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10254580/

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