2015-07-20 28 views
7

展望的method迭代IEnumerable <T>。最好的辦法?

void InsertRange(int index, IEnumerable<T> collection) 

實施在列表<>類(.NET框架4.5.2),我可以看到一個迭代一個集合這樣

using(IEnumerator<T> en = collection.GetEnumerator()) { 
    while(en.MoveNext()) { 
     Insert(index++, en.Current);          
    }     
} 

我想知道什麼可能是更喜歡這種語法的原因

foreach(var item in collection) 
{ 
    Insert(index++, item) 
} 

我已經創建了一個程序集與兩個方法每一個使用不同的方法。然後,查看生成的IL代碼,我可以看到兩種方法都調用通過執行IEnumerator<T>執行的Dispose方法,因此調用IDisposable。因此IDisposable不是原因,這是我的問題。

除了簡單樣式(ish)首選項之外,是否有任何理由更喜歡一種語法與另一種語法?

+0

的foreach的背後場景列舉你看到的實現方式, –

回答

5

foreach是推薦的方法,因爲您沒有指定有關如何迭代枚舉的詳細信息。此外,您可以編寫更少的代碼並且更具可讀性。

+0

我想知道爲什麼.NET框架團隊沒有在該實現中使用foreach,但 –

+0

其原因是「IEnumerable」不應該有副作用。 –

+0

@jmelosegui http://stackoverflow.com/questions/101265/why-is-there-not-a-foreach-extension-method-on-the-ienumerable-interface –

3

它們完全相同,它的名稱爲句法糖。使用foreach的唯一原因是因爲它的短,不易出錯,更具可讀性等

可以chceck上foreach執行上MSDN文章。

0

for循環比foreach循環更快。現在差別很小,所以通常不值得考慮。我認爲早期版本的.net有更大的差異。

0

任何繼承自IEnumerable<T>(可枚舉對象)的集合都可以使用foreach循環來枚舉。

考慮這個例子:

foreach(char c in "Ehsan") 
{ 
    Console.WriteLine(c); 
} 

這是bascially迭代IEnumerable<T>高水平方式,如果枚舉實現iDisposableforeach語句使用using聲明,它implilctly將配置枚舉器對象。

處於較低水平,我們可以wrtie它:

using(var enumerator = "Ehsan".GetEnumerator()) 
{ 
    while(enumerator.MoveNext()) 
    { 
     var element = enumerator.Current; 
     Console.WriteLine(element); 
    } 

} 

所以foreach爲你做的工作,你不必像上面寫的基本上枚舉IEnumeable<T>