-6

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

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

4

3 回答 3

3

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

foreach (var list1Value in list1) {
    var tmp = list1Value;
    foreach (var list2Value in list2.Where(item => item == tmp)) {
        // Do something
    }
}
于 2013-05-20T15:46:24.447 回答
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
}
于 2013-05-20T15:49:24.233 回答
2

foreach好吧,如果您选择使用or循环并不重要,while因为循环在编译为 IL 之后foreach实际上被分解为循环。while

看看这个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

于 2013-05-20T15:51:23.450 回答