C# LINQ知道如何优化吗;疑问;?
假设我做了类似的事情C# LINQ知道如何优化吗;疑问;?,c#,.net,algorithm,linq,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.
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 ) );
var Ordered=MyList.Sort((x,y)=>x.prop1!=y.prop1?x.prop1
如果它确实进行了某种优化,并且在这个过程中没有返回中间列表,那么它如何知道如何进行优化呢?如何编写一个类来优化自身的方法链?毫无意义
是否MyList.OrderBy(x=>x.prop1)
返回筛选后的列表
否。LINQ方法(至少通常)返回查询,而不是执行这些查询的结果
OrderBy
仅返回一个对象,当您向该对象请求某个项目时,该对象将返回给定特定顺序的集合中的第一个项目。但除非你真的要求结果,否则它什么也做不了
注意:您也可以通过查看OrderBy返回的内容来了解情况。它返回IOrderedEnumerable
。该接口有一个方法CreateOrderedEnumerable
,该方法:
根据键对IOrderedEnumerable的元素执行后续排序
该方法就是ThenBy
用来表示有后续排序的方法
这意味着在需要在结果集中生成单个项之前,您正在从OrderBy
和所有然后是by
调用构建所有要使用的比较器
有关如何创建此行为的详细信息,请参阅。LINQ的什么风格?LINQ到对象、LINQ到实体等?如果LINQ到实体,哪个LINQ提供程序?有很多。请注意,EF7中有一些更改使Linq to Entities提供程序更容易更好地优化查询。如果连接到数据库,请使用SQL事件探查器比较在每种情况下生成的数据库查询,并查看差异(如果有)。Linq(to objects)不会“优化”查询,但它尝试尽可能少的工作,通常会产生“足够好”的结果。这不是一个银弹,对于高性能代码,您可能会发现自己必须手工编写(例如,Roslyn不允许LINQ在内部使用,因为直接循环更容易预测实际成本)。相反,它也可以与高性能代码一起完全正常工作,我在当前系统中使用L2O处理数百万条记录。表演总是轮廓,轮廓,轮廓。即使Jon Skeet不回答问题,他也会回答问题。