2013-05-20 70 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 
}