我正在尝试了解以下 LINQ 查询的自定义排序逻辑:
var random = new Random();
var cnt = Enumerable.Range(0, 10).OrderBy(i => random.NextDouble()).ToList();
这种比较的内在逻辑是什么,我如何与随机进行比较。NextDouble() 内部使结果列表总是不同?
它相当于:
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
具体化排序键,以便为每个元素精确计算一个排序键。这样做是为了性能和(在您的情况下)正确性。
这是一个用于洗牌数组的简单实现。 random.NextDouble()
每次都会给你一个随机数,所以输出序列顺序是随机的。