首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OrderBy、ThenBy和IOrderedEnumerable<T>

OrderBy、ThenBy和IOrderedEnumerable<T>
EN

Stack Overflow用户
提问于 2011-05-02 18:35:13
回答 3查看 1.7K关注 0票数 3
代码语言:javascript
复制
    string[] fruits = { "grape", "passionfruit", "banana", "mango", 
                          "orange", "raspberry", "apple", "blueberry" };

    // Sort the strings first by their length and then 
    //alphabetically by passing the identity selector function.
    IEnumerable<string> query =
        fruits.OrderBy(fruit => fruit.Length).ThenBy(fruit => fruit);

如果我们需要比单次调用OrderBy更多的排序,那么我们应该随后调用ThenBy而不是OrderBy,因为由ThenBy执行的排序是稳定的,从而保持了输入元素的排序具有相同的键值。

( a)在上面的示例中,OrderBy返回IOrderedEnumerable<>序列R,然后在这个序列上调用ThenBy。当OrderBy返回R时,R是否也存储OrderBy用来对R中的元素排序的键值(fruit.Length值)?

( b)在R中,键值存储在哪里?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-02 18:58:25

我认为这个问题的答案与你想的不同;

OrderByThenBy是所谓的“递延运算符”。你所说的行为在某种程度上是正确的,但实际上不是.

OrderBy确实返回您建议的类型的引用。但该对象不是传统意义上的集合;它是表达式树的一部分。随后对ThenBy的调用进一步修改了这个表达式树。

所述表达式树实际上可能按照您可能假设的顺序进行排序。它甚至可能检测到您每次都试图执行相同的排序,而不是同时执行它们(在示例代码中没有做过任何这样的事情,但我只是想说明一点)。

特别是,执行单个OrderByThenBy实际上可以快速、轻松地完成这些操作.倒过来。记住关于OrderBy是不确定的.

代码语言:javascript
复制
var names = //initialize list of names;
var namesByAlpha = BubbleSort(names=>names);
var namesByAlphaAndLength = BubbleSort(namesByAlpha=>namesByAlpha.Length);

假设BubbleSort是一种排序方法,方法是将列表中的每一项与下一项进行比较,并在需要时交换位置(保留相同的情况),然后重复,直到整个列表不再需要交换.这将得到与您发布的LINQ方法相同的结果.但是请注意,它首先根据名字alpha进行排序。当它随后按长度排序时,它将按字母顺序保留等效长度的名称,从而使OrderBy显示长度为“先”,然后按字母顺序排列。

OrderByThenBy可能不执行Bubble排序(对于任何可观大小的集合,它都是非常低效的),但是要理解它们所做的事情,您需要了解它们正在构建一个表达式树,当您枚举集合时会执行该表达式树,并且该表达式树正在考虑操作的全部列表。它不仅仅是做一种,然后做下一种..。每一个都是单独的行动。

票数 6
EN

Stack Overflow用户

发布于 2011-05-02 18:41:52

没有“键”。OrderBy返回与原始枚举类型相同的枚举。

票数 2
EN

Stack Overflow用户

发布于 2011-05-02 18:38:26

您的键值是从列表中的元素生成的。由于仍然可以访问排序列表中的元素,所以仍然可以获得键值:

代码语言:javascript
复制
// enumerate the sorted list
foreach (string fruit in query) {
    int length = fruit.Length;  // grab the key value
    // do something with key value
}

这就是你的意思吗?也许您正在考虑GroupBy,它将收集具有相同键值的项目?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5860949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档