2013-01-09 27 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是安全的。即使您想要的順序是隱式提供的,但如果您需要它,最好定義一個顯式順序。看起來你正在通過方法名稱來判斷。