当前位置:  开发笔记 > 编程语言 > 正文

一次循环2个列表

如何解决《一次循环2个列表》经验,为你挑选了3个好方法。

我有两个长度相同的列表,是否可以一次循环这两个列表?

我正在寻找正确的语法来执行以下操作

foreach itemA, itemB in ListA, ListB
{
  Console.WriteLine(itemA.ToString()+","+itemB.ToString());
}

你认为这在C#中有可能吗?如果是的话,lambda表达式与此相当的是什么?



1> Marc Gravell..:

[编辑]:澄清; 这在通用LINQ/IEnumerablecontext中非常有用,在这种情况下你不能使用索引器,因为a:它不存在于可枚举中,而b:你不能保证你可以多次读取数据.由于OP提到了lambdas,所以LINQ可能不会太远(是的,我确实意识到LINQ和lambdas不是完全相同的事情).

听起来你需要缺少的Zip操作员; 你可以欺骗它:

static void Main()
{
    int[] left = { 1, 2, 3, 4, 5 };
    string[] right = { "abc", "def", "ghi", "jkl", "mno" };

    // using KeyValuePair<,> approach
    foreach (var item in left.Zip(right))
    {
        Console.WriteLine("{0}/{1}", item.Key, item.Value);
    }

    // using projection approach
    foreach (string item in left.Zip(right,
        (x,y) => string.Format("{0}/{1}", x, y)))
    {
        Console.WriteLine(item);
    }
}

// library code; written once and stuffed away in a util assembly...

// returns each pais as a KeyValuePair<,>
static IEnumerable> Zip(
    this IEnumerable left, IEnumerable right)
{
    return Zip(left, right, (x, y) => new KeyValuePair(x, y));
}

// accepts a projection from the caller for each pair
static IEnumerable Zip(
    this IEnumerable left, IEnumerable right,
    Func selector)
{
    using(IEnumerator leftE = left.GetEnumerator())
    using (IEnumerator rightE = right.GetEnumerator())
    {
        while (leftE.MoveNext() && rightE.MoveNext())
        {
            yield return selector(leftE.Current, rightE.Current);
        }
    }
}



2> jcelgin..:

相反,在一个普通的旧循环中做它会简单得多......

for(int i=0; i


区别在于您只需要一次*的Zip扩展方法*,您可以永久重用它.此外,它将适用于任何序列而不仅仅是列表.
我被Jon Skeet羞辱了:(

3> 小智..:

你可以明确地做到这一点.

IEnumerator ListAEnum = ListA.GetEnumerator();
IEnumerator ListBEnum = ListB.GetEnumerator();

ListBEnum.MoveNext();
while(ListAEnum.MoveNext()==true)
{
  itemA=ListAEnum.getCurrent();
  itemB=ListBEnum.getCurrent();
  Console.WriteLine(itemA.ToString()+","+itemB.ToString());
}

至少这个(或类似的东西)是编译器为foreach循环所做的事情.我没有测试它,我猜测枚举器缺少一些模板参数.

只需从List和IEnumerator-Interface中查找GetEnumerator().

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有