LINQ知道如何优化“查询”吗?

时间:2016-01-27 20:50:37

标签: c# .net algorithm linq

假设我做了类似

的事情
 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 ) );

如果它确实进行了某种优化,并且在此过程中未返回中间列表,那么它如何知道如何做到这一点?你如何编写一个优化方法链的类?没有意义。

1 个答案:

答案 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