假设我做了类似
的事情 var Ordered = MyList.OrderBy(x => x.prop1).ThenBy(x => x.prop2);
MyList.OrderBy(x => x.prop1)
是否会返回已过滤的列表,然后按ThenBy(x => x.prop2)
进一步过滤该列表?换句话说,它是否等同于
var OrderedByProp1 = MyList.OrderBy(x => x.prop1);
var Ordered = OrderedByProp1.OrderBy(x => x.prop2);
???
因为显然可以通过使用比较器运行排序算法来优化它:
var Ordered = MyList.Sort( (x,y) => x.prop1 != y.prop1 ? x.prop1 < y.prop1 : ( x.prop2 < y.prop2 ) );
如果它确实进行了某种优化,并且在此过程中未返回中间列表,那么它如何知道如何做到这一点?你如何编写一个优化方法链的类?没有意义。
答案 0 :(得分:7)
MyList.OrderBy(x => x.prop1)
是否会返回已过滤的列表
没有。 LINQ方法(至少通常)返回查询,而不是执行这些查询的结果。
OrderBy
只返回一个对象,当你向它询问一个项目时,它将返回给定特定排序的集合中的第一个项目。但是直到你实际问它结果它没有任何。
请注意,通过查看OrderBy
返回的内容,您还可以了解正在进行的操作。它返回IOrderedEnumerable<T>
。该接口有一个方法CreateOrderedEnumerable
,其中包含:
根据密钥对IOrderedEnumerable的元素执行后续排序。
该方法是ThenBy
用来表示后续排序的方法。
这意味着您需要在OrderBy
和所有ThenBy
来电之前构建您想要使用的所有比较器,然后才能生成单个结果集中的项目。
有关完全的详细信息,请参阅Jon Skeet's blog series on the subject。