gpt4 book ai didi

c# - 在 LINQ 中,orderby() 是只执行一次比较函数还是在需要时执行它?

转载 作者:太空狗 更新时间:2023-10-29 17:56:40 24 4
gpt4 key购买 nike

我在网上找到了一种对数组进行洗牌的方法。

Random rand = new Random();
shuffledArray = myArray.OrderBy(x => rand.Next()).ToArray();

不过,我有点担心这个方法的正确性。如果 OrderBy 对同一个项目多次执行 x => rand.Next(),结果可能会发生冲突并导致奇怪的事情(可能是异常)。

我试过了,一切正常,但我仍然想知道这是否绝对安全并且始终按预期工作,我无法通过 Google 找到答案。

谁能给我一些解释?

提前致谢。

最佳答案

您的方法应该可行,但速度很慢。

之所以有效,是因为 OrderBy 首先使用键选择器计算每个项目的键,然后对键进行排序。所以键选择器每个项目只调用一次。

在 .NET Reflector 中,查看 EnumerableSorter 类中的方法 ComputeKeys

this.keys = new TKey[count];
for (int i = 0; i < count; i++)
{
this.keys[i] = this.keySelector(elements[i]);
}
// etc...

whether this is absolutely safe and always works as expected

它没有记录在案,所以理论上它可能会在未来发生变化。

要随机洗牌,您可以使用 Fisher-Yates shuffle .这也更有效 - 仅使用 O(n) 时间和就地洗牌而不是 O(n log(n)) 时间和 O(n) 额外内存。

相关问题

关于c# - 在 LINQ 中,orderby() 是只执行一次比较函数还是在需要时执行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3958011/

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