Linq OrderBy、ThenBy和IOrderedEnumerable<;T>; string[]水果={“葡萄”、“西番莲”、“香蕉”、“芒果”, “橙子”、“覆盆子”、“苹果”、“蓝莓”}; //首先按字符串的长度对其排序,然后 //按字母顺序传递标识选择器函数。 IEnumerable查询= 水果.OrderBy(水果=>水果.长度),然后by(水果=>水果);
如果我们需要比单个调用Linq OrderBy、ThenBy和IOrderedEnumerable<;T>; string[]水果={“葡萄”、“西番莲”、“香蕉”、“芒果”, “橙子”、“覆盆子”、“苹果”、“蓝莓”}; //首先按字符串的长度对其排序,然后 //按字母顺序传递标识选择器函数。 IEnumerable查询= 水果.OrderBy(水果=>水果.长度),然后by(水果=>水果);,linq,Linq,如果我们需要比单个调用OrderBy更多的排序,那么我们应该随后调用ThenBy而不是OrderBy,因为ThenBy执行的排序是稳定的,因此保留了具有相同键值的输入元素的排序 a) 在上面的示例中,OrderBy返回IOrderedEnumerablesequenceR,然后对该序列调用ThenBy。当OrderBy返回R时,R是否也存储了OrderBy用于排序R中元素的键值(fruit.Length值) b) 在R中,键值存储在哪里 谢谢您的键值是从列表中的元素生成的。由于您仍然可以访问排序
OrderBy
更多的排序,那么我们应该随后调用ThenBy
而不是OrderBy,因为ThenBy
执行的排序是稳定的,因此保留了具有相同键值的输入元素的排序
a) 在上面的示例中,OrderBy
返回IOrderedEnumerable
sequenceR,然后对该序列调用ThenBy
。当OrderBy
返回R时,R是否也存储了OrderBy
用于排序R中元素的键值(fruit.Length
值)
b) 在R中,键值存储在哪里
谢谢您的键值是从列表中的元素生成的。由于您仍然可以访问排序列表中的元素,因此仍然可以获取键值:
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);
这就是你的意思吗??也许您正在考虑使用
GroupBy
,它将具有相同键值的项收集在一起?没有“键”。OrderBy
返回与原始枚举类型相同的枚举。我认为这个问题的答案与您所想的不同
OrderBy
和ThenBy
是所谓的“延迟运算符”。你所描述的行为在某种程度上是正确的,但实际上不是
OrderBy
确实返回您建议的类型的引用。但该物品并非传统意义上的收藏品;它是表达式树的一部分。随后对ThenBy
的调用进一步修改此表达式树
所述表达式树实际上可能按照与您可能假设的相反顺序进行排序。它甚至可能检测到您每次都尝试执行相同的排序,而不是同时执行这两种排序(您在示例代码中没有执行任何此类操作,但我只是想说明一点)
特别是,通过执行这些排序,实际上可以快速轻松地完成单个OrderBy
和ThenBy
。。。反过来说。请记住所说的“排序依据”是不确定的
// enumerate the sorted list
foreach (string fruit in query) {
int length = fruit.Length; // grab the key value
// do something with key value
}
假设BubbleSort
是一种排序方法,它沿着列表向下排序,将每个项目与下一个项目进行比较,并在需要时交换位置(不考虑相同的情况),然后重复,直到整个列表不再需要交换为止。。。这将得到与您发布的LINQ方法相同的结果。。。但请注意,它首先按名称alpha进行排序。当它稍后按长度排序时,它会按字母顺序保留相同长度的名称,从而显示为OrderBy
长度“先”,然后按字母顺序排列
OrderBy
和ThenBy
可能不会进行冒泡排序(对于任何可感知大小的集合都是非常低效的),但要了解它们的作用,您需要了解它们正在构建一个表达式树,在枚举集合时执行该树,表达式树考虑了操作的总列表。它不仅仅是做一种,然后再做下一种。。。每个操作都是独立的。您是否在考虑GroupBy
?我对表达式树一无所知,但我知道延迟运算符是什么。例如,OrderBy返回一个实现IOrderedEnumerable的对象,只有在枚举该对象时,才会实际执行OrderBy查询。无论如何,我理解你的解释是,当对OrderBy返回的对象R调用ThenBy时,ThenBy实际上并没有枚举对象R,而是»修改«R的代码并将这个“修改过的”R返回给调用者;所有延迟运算符在任何时候都不会单独运行。您可以通过这种方式来简化组合查询,但真正发生的是一个包含所有延迟运算符的表达式树正在构建中;它仅在由某些非延迟运算符或传统枚举序列枚举时才最终确定并执行。所以,OrderBy
和ThenBy
是同一个表达式树的一部分。“这就是你的意思吗?”“不。请看我对AndrewI的回复,我不知道你想知道它实际上是如何工作的。对不起,我想我太实际了:)
var names = //initialize list of names;
var namesByAlpha = BubbleSort(names=>names);
var namesByAlphaAndLength = BubbleSort(namesByAlpha=>namesByAlpha.Length);