4

我试图了解以下 LINQ 查询的自定义排序逻辑:

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

这种比较的内在逻辑是什么,我如何与 random.NextDouble() 进行比较,使结果列表总是不同的?

4

2 回答 2

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具体化排序键,以便为每个元素精确评估一个。它这样做是为了提高性能和(在你的情况下)为了正确性。

于 2013-01-23T11:15:19.390 回答
4

这是一个简单的对数组进行洗牌的实现。random.NextDouble()每次给你一个随机数,所以输出序列顺序是随机的。

于 2013-01-23T11:15:06.133 回答