2013-01-09 25 views
15

我有一个List<Person>,而是要将其转换为简单加工到List<string>,执行以下操作:是否LINQ到对象保持其顺序

List<Person> persons = GetPersonsBySeatOrder(); 
List<string> seatNames = persons.Select(x => x.Name).ToList(); 

Console.WriteLine("First in line: {0}", seatNames[0]); 

是在LINQ的.Select()语句来保证对象的对象不改变列表成员的顺序?假设没有明确区分/分组/排序被添加

此外,如果任意.Where()子句首先使用,它仍然保证保持相对顺序,或有时使用非迭代过滤吗?


正如Fermin在上面所述,这实质上是一个重复的问题。我没上选择正确的关键词进行搜索计算器

Preserving order with LINQ

+5

linq查询和排序在这里的好细节:http://stackoverflow.com/questions/204505/preserving-order-with-linq – Fermin

回答

3

在当前的.NET实现它使用这种代码。但是不能保证这种实现将来会发生。

private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector) 
{ 
    int index = -1; 
    foreach (TSource source1 in source) 
    { 
    checked { ++index; } 
    yield return selector(source1, index); 
    } 
} 
+2

我怀疑这种广泛使用的方法,如.Select()的内部实现会更改为以不同的顺序返回对象。 – Fermin

+1

数据库行没有保证的顺序。列表可以。它应该完全依赖于底层的集合类型(即底层集合类型的*枚举器*),并且列表顺序应该保留,保证。选择将使用列表类型的枚举器,并且目前它保留订单,保证。 – Triynko

2

它比任何东西都更依赖于底层集合类型。您可能会从HashSet中获得不一致的排序,但List是安全的。即使您想要的顺序是隐式提供的,但如果您需要它,最好定义一个显式顺序。看起来你正在通过方法名称来判断。