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

LLS*_*LLS 9 .net c# linq

我找到了一种在互联网上洗牌的方法.

Random rand = new Random();
shuffledArray = myArray.OrderBy(x => rand.Next()).ToArray();
Run Code Online (Sandbox Code Playgroud)

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

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

谁能给我一些解释?

提前致谢.

Mar*_*ers 3

你的方法应该有效,但速度很慢。

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

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

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

这是否绝对安全并且始终按预期工作

它没有记录,所以理论上它将来可能会改变。

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

相关问题