2009-03-04 62 views
14

一位同事使用for循環來迭代他編寫的一些C#代碼中的List,並且留下了評論,「沒有使用For Each,因爲我不確定它是否按順序迭代,誰知道微軟會做什麼。」例如,假設我們已經建立了這樣的名單:.NET foreach語句是否保證以與構建集合相同的順序迭代集合?

var someList = new List<string>(); 

someList.Add("one"); 
someList.Add("two"); 
someList.Add("three"); 

我的同事使用的是這樣的:

for (int i = 0; i < someList.Count; i++)  
{ 
    System.Diagnostics.Debug.WriteLine(someList[i]); 
} 

,而不是這樣的:

foreach (var item in someList)    
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

我猜他是害怕項目可能會以與添加到集合中不同的順序出現。我認爲他有點偏執,但從技術上講,文檔並沒有說明集合迭代的順序。 foreach語句是否有可能以任何順序遍歷數組或集合對象,而不是從最低邊界到最高邊界?

回答

33

你的問題是關於List<T>,它確實維持秩序。

單獨的foreach不能保證做任何事情。它只是問爲它的枚舉器提供的對象,它可能會做任何事情。

+3

+1哦,不,Skeet效應讓你的選票減少。 – 2009-03-04 21:27:10

+0

測試以查看我是否可以克服Skeet效應。手指交叉。 – 2009-03-04 21:27:49

22

它依賴於集合:

  • 對於List<T>它保證是插入順序。 (假設只需要Add調用,如果您在特定位置插入元素到列表中,他們會按照您的期望返回到正確的位置)。基本上,您可以通過使用list[0],list[1]list[2]
  • 對於Dictionary<TKey, TValue>沒有保證排序。
  • 對於SortedList<TKey, TValue>(以及類似的)它將在關鍵的比較順序 - 這是類型的要點。
  • 數組總是按元素順序出現。
4

要具體回答這個問題,「foreach」返回的是那個訂單。 GetEnumerator()返回。對於列表,這是您添加到最後的順序。對於字典,它可能是分配事物的桶的順序。