Sub*_*Dev 5 .net c# linq algorithm
假设我做了类似的事情
var Ordered = MyList.OrderBy(x => x.prop1).ThenBy(x => x.prop2);
Run Code Online (Sandbox Code Playgroud)
是否MyList.OrderBy(x => x.prop1)返回已过滤的列表,然后进一步过滤该列表ThenBy(x => x.prop2)?换句话说,它是否相当于
var OrderedByProp1 = MyList.OrderBy(x => x.prop1);
var Ordered = OrderedByProp1.OrderBy(x => x.prop2);
Run Code Online (Sandbox Code Playgroud)
???
因为很明显可以通过使用比较器运行排序算法来优化它:
var Ordered = MyList.Sort( (x,y) => x.prop1 != y.prop1 ? x.prop1 < y.prop1 : ( x.prop2 < y.prop2 ) );
Run Code Online (Sandbox Code Playgroud)
如果它确实进行了某种优化,并且在过程中没有返回中间列表,那么它如何知道如何做到这一点?你如何编写一个优化方法链的类?没有意义.
是否
MyList.OrderBy(x => x.prop1)返回已过滤的列表
否.LINQ方法(至少通常)返回查询,而不是执行这些查询的结果.
OrderBy只返回一个对象,当你向它询问一个项目时,它将返回给定特定顺序的集合中的第一个项目.但是直到你实际问它结果它没有做任何事情.
请注意,通过查看OrderBy返回值,您还可以了解正在发生的事情.它回来了IOrderedEnumerable<T>.该接口有一个方法CreateOrderedEnumerable:
根据密钥对IOrderedEnumerable的元素执行后续排序.
该方法ThenBy用于表示存在后续排序.
这意味着您需要在结果集中生成单个项目之前,从OrderBy所有ThenBy调用和所有调用构建所有要使用的比较器.
关于更多的细节究竟如何可以去创造这个行为,请参阅乔恩斯基特对这个问题的博客系列.