2013-01-23 67 views
4

我想了解自定义排序以下LINQ查询的逻辑:LINQ的排序依据逻辑

var random = new Random(); 
var cnt = Enumerable.Range(0, 10).OrderBy(i => random.NextDouble()).ToList(); 

什么是这种对比的内在逻辑,我怎么做比较random.NextDouble()内使结果列表总是不同的?

+1

我不知道你的问题是什么。每个数字最初与一个随机双键相关联,然后这些数字将根据其键进行排序。由于每次排序顺序不同,键的选择也不同。 – Jon

回答

8

它等效于:

var cnt = 
Enumerable.Range(0, 10) 
.Select(i => new { i, rand = random.NextDouble() }) //"weave" the random temporary 
.OrderBy(x => x.rand) //sort 
.Select(x => x.i) //remove it 
.ToList(); 

的随机值逻辑成为列表的一部分。

作为实现细节(从.NET 2.0到4.5),OrderBy实现了排序关键字,以便对每个元素精确地评估一个排序关键字。它是为了性能和(在你的情况下)的正确性。

+0

谢谢。现在很明显,每次新的类型{i,random.NextDouble()}正在生成:) – Alex

4

这是一个用于混洗数组的简单实现。 random.NextDouble()每次给你一个随机数,所以输出顺序是随机的。