[英]Does LINQ know how to optimize “queries”?
假设我做了类似的事情
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 ) );
如果它确实进行了某种优化,并且在过程中没有返回中间列表,那么它如何知道如何做到这一点? 你如何编写一个优化方法链的类? 没有意义。
MyList.OrderBy(x => x.prop1)
返回已过滤的列表
否.LINQ方法(至少通常)返回查询 ,而不是执行这些查询的结果 。
OrderBy
只返回一个对象,当你向它询问一个项目时,它会返回给定特定排序的集合中的第一个项目。 但是直到你实际问它结果它没有做任何事情 。
请注意,通过查看OrderBy
返回的内容,您还可以了解正在发生的事情。 它返回IOrderedEnumerable<T>
。 该接口有一个方法CreateOrderedEnumerable
,其中:
根据密钥对IOrderedEnumerable的元素执行后续排序。
该方法是ThenBy
用来表示存在后续排序的方法。
这意味着您需要在结果集中生成单个项目之前 ,从OrderBy
和所有ThenBy
调用构建所有要使用的比较器。
关于究竟如何去创造这种行为更多的细节,请参见乔恩斯基特对这个问题的博客系列 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.