Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ知道如何优化吗;疑问;?_C#_.net_Algorithm_Linq - Fatal编程技术网

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不回答问题,他也会回答问题。