哪个循环更有效/更可取 - foreach或while循环

时间:2013-05-20 15:43:43

标签: c#

foreach循环中的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};
foreach (var list1Value in list1)
{
    foreach (var list2Value in list2)
    {
        if (list1Value == list2Value)
            // do something
    }
}

或者foreach循环中的IEnumerable

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
    }
}

我更喜欢第一个用于阅读,但认为第二个更有效。请注意,代码只是一个示例,它并不表示我实际运行的代码。

3 个答案:

答案 0 :(得分:3)

每个列表有10个项目,没有人关心通过调用Reset保存的10个枚举器分配。这绝对是微优化,即使第二种方法确实为您节省了一些分配。我肯定会考虑第一种方法的可读性,甚至添加一些LINQ,如下所示:

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

答案 1 :(得分: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
}

答案 2 :(得分: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();
}

我总是更喜欢更可读的代码,它绝对是foreach循环。 有关详细信息,请阅读这篇精彩的文章:http://www.abhisheksur.com/2011/01/internals-of-loops-while-for-and.html