2013-05-20 69 views
-6

foreach循環裏面一個foreach:哪個循環更高效/最好 - 的foreach或while循環

var list1 = new List<int>() {0,1,2,3,4,5,6,7,8,9}; 
var list2 = new List<int>() {9,8,7,6,5,4,3,2,1,0}; 
foreach (var list1Value in list1) 
{ 
    foreach (var list2Value in list2) 
    { 
     if (list1Value == list2Value) 
      // do something 
    } 
} 

或IEnumerable的foreach循環內

var list1 = new List<int>() {0,1,2,3,4,5,6,7,8,9}; 
var list2 = new List<int>() {9,8,7,6,5,4,3,2,1,0} 
var enumerator = (System.Collections.IEnumerator)list2.GetEnumerator(); 
foreach (var list1Value in list1) 
{ 
    enumerator.Reset(); 
    while (enumerator.MoveNext()) 
    { 
     if (list1Value == (int)enumerator.Current) 
      // Do something 
    } 
} 

我更喜歡第一的可讀性,但認爲第二個更有效率。請注意,代碼只是一個示例,並不代表我實際運行的代碼。

+0

這是個人偏好,因此我懷疑這會關閉。我個人發現第一個更具可讀性。無需過分複雜的解決方案。 – Arran

+0

你打算爲「做些什麼」做什麼? – shahkalpesh

+0

foreach在foreach中,編譯器是否在第一個foreach循環的每次迭代中爲第二個foreach創建一個新的枚舉器? –

回答

2

那麼,如果你選擇使用foreachwhile環路,因爲環路foreach實際上是分成一個while環已編譯IL後也沒關係。

看看這個foreach循環:

IEnumerable<int> enumerable = Enumerable.Range(1, 100); 
foreach (int e in enumerable) 
{ 

} 

後,它已經被編譯到IL它看起來像這樣:

var enumerable = Enumerable.Range(1, 100); 
IEnumerator<int> enumerator = enumerable.GetEnumerator(); 
try 
{ 
    while (enumerator.MoveNext()) 
    { 
     int element = enumerator.Current; 
     //here goes your action instructions 
    } 
} 
finally 
{ 
    IDisposable disposable = enumerator as System.IDisposable; 
    if (disposable != null) disposable.Dispose(); 
} 

我總是會選擇更加可讀代碼definitly是foreach循環。 欲瞭解更多信息,請閱讀這篇文章:http://www.abhisheksur.com/2011/01/internals-of-loops-while-for-and.html

3

每個列表中有十個項目,沒有人關心由調用Reset保存的調查員的十個分配。這絕對是一種微型優化,即使第二種方法可以爲您節省一些分配。我肯定會去的第一種方法的更多可讀性,甚至添加一些LINQ,像這樣:

foreach (var list1Value in list1) { 
    var tmp = list1Value; 
    foreach (var list2Value in list2.Where(item => item == tmp)) { 
     // Do something 
    } 
} 
3

這是否你想要做什麼?

var list1 = new List<int>() {0,1,2,3,4,5,6,7,8,9}; 
var list2 = new List<int>() {9,8,7,6,5,4,3,2,1,0}; 
foreach (var item in list1.Intersect(list2)) 
{ 
    // Do something 
}