是否可以在LINQ-to-objects中保存顺序?

Hei*_*nzi 7 .net c# linq linq-to-objects

var source = new List<string> { "A1", "A2", "B1", "B2" };
var filtered = source.Where(s => s.StartsWith("A"));

foreach (var s in filtered)
    Console.WriteLine(s);    // outputs first A1 and then A2
Run Code Online (Sandbox Code Playgroud)

似乎Enumerable.Where保持单元的原始顺序上的有序的IEnumerable使用时(如List<T>T[]).总是这样吗?如果是的话,这会记录在哪里?

小智 7

Microsoft确实记录了LINQ to Objects保留排序.文档 http://msdn.microsoft.com/en-us/library/dd460677%28v=vs.110%29.aspx

在PLINQ中,目标是在保持正确性的同时最大化性能.查询应尽可能快地运行,但仍会产生正确的结果.在某些情况下,正确性要求保留源序列的顺序; 但是,订购可能在计算上很昂贵.因此,默认情况下,PLINQ不保留源序列的顺序.在这方面,PLINQ类似于LINQ to SQL,但不像LINQ to Objects,它确实保留了排序.

正如这篇stackoverflow文章中提到的一些LINQ方法的microsoft文档,它们没有保留顺序.例如,不同文档提到此方法返回无序序列.


Jam*_*son 6

使用Enumerable.Where方法保留订单.

在SO上有一个类似的问题,第一个答案分解了哪些方法保留了顺序:

使用LINQ保留订单