gpt4 book ai didi

c# - Enumerable.OrderBy如何使用keySelector

转载 作者:太空狗 更新时间:2023-10-29 21:09:37 26 4
gpt4 key购买 nike

使用前面的代码,我成功地生成了一个数字集合并打乱了元素在数组中的位置:

var randomNumbers = Enumerable.Range(0, 100)
.OrderBy(x => Guid.NewGuid());

一切正常,但在我尝试理解 Enumerable.OrderBy 时,它有点妨碍我的工作.以下面的代码为例:

var pupils = new[] 
{
new Person() { Name = "Alex", Age = 17 },
new Person() { Name = "Jack", Age = 21 }
};

var query = pupils.OrderBy(x => x.Age);

据我了解,我正在传递我希望作为排序依据的属性,并且我假定 LINQ 将使用 Comparer<T>.Default确定如果没有明确的集合如何排序 IComparer指定用于第二个过载。我真的看不出如何应用任何这种合理的逻辑以这种方式对数组进行洗牌。那么 LINQ 如何让我像这样打乱数组?

最佳答案

How does Enumerable.OrderBy use keySelector?

Enumerable.OrderBy<T>延迟返回 - 不直接调用 keySelector。结果是 IOrderedEnumerable<T>将在枚举时执行排序。

枚举时,为每个元素调用一次 keySelector。键的顺序定义了元素的新顺序。

这是一个漂亮的 sample implementation .


So how does LINQ let me shuffle an array like this?

var randomNumbers = Enumerable
.Range(0, 100)
.OrderBy(x => Guid.NewGuid());

为每个元素调用 Guid.NewGuid。对第二个元素的调用生成的值可能高于或低于对第一个元素的调用。

randomNumbers是一个 IOrderedEnumerable<int>每次枚举时都会产生不同的顺序。每次每个元素调用一次 KeySelector randomNumbers被枚举。

关于c# - Enumerable.OrderBy如何使用keySelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14118844/

26 4 0