gpt4 book ai didi

c# - 如果 keySelector 很慢,如何优化 LINQ OrderBy?

转载 作者:行者123 更新时间:2023-11-30 19:29:40 27 4
gpt4 key购买 nike

我想使用可能需要一些时间来计算的值对对象列表进行排序。现在我有这样的代码:

public IEnumerable<Foo> SortFoo(IEnumerable<Foo> original)
{
return foos.OrderByDescending(foo => CalculateBar(foo));
}

private int CalculateBar(Foo foo)
{
//some slow process here
}

上面代码的问题在于,它会为每个项目多次调用calculate value,这是不好的。可能的优化是使用缓存值(可能是字典),但这意味着 SortFoo 必须在每次排序后清除缓存(以避免内存泄漏,我确实希望在每个 SortFoo 上重新计算值 调用)。

这个问题有没有更简洁、更优雅的解决方案?

最佳答案

看来 .OrderBy() 已经针对慢速 keySelector 进行了优化。

基于以下内容,.OrderBy() 似乎缓存了您提供的 keySelector 委托(delegate)的结果。

var random = new Random(0);
var ordered = Enumerable
.Range(0, 10)
.OrderBy(x => {
var result = random.Next(20);
Console.WriteLine("keySelector({0}) => {1}", x, result);
return result;
});
Console.WriteLine(String.Join(", ", ordered));

这是输出:

keySelector(0) => 14
keySelector(1) => 16
keySelector(2) => 15
keySelector(3) => 11
keySelector(4) => 4
keySelector(5) => 11
keySelector(6) => 18
keySelector(7) => 8
keySelector(8) => 19
keySelector(9) => 5
4, 9, 7, 3, 5, 0, 2, 1, 6, 8

如果它在每次比较时运行一次委托(delegate),我会看到不止一次对我的 keySelector 委托(delegate)的调用。

关于c# - 如果 keySelector 很慢,如何优化 LINQ OrderBy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11430631/

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