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

迭代多个列表

如何解决《迭代多个列表》经验,为你挑选了1个好方法。

鉴于一堆列表,我需要同时迭代它们.假设我有三个人:list1,list2,和list3.

到目前为止我发现的是:

foreach (var tuple in list1.Zip(list2, (first, second) => new { object1 = first, object2 = second })
                          .Zip(list3, (first, second) => new { object1 = first.object1, object2 = first.object2, object3 = second }))
{
  //do stuff
}

除非列表的数量不大,否则这种方法很好并且可读性很强.我知道如何将它进一步扩展到4,5,....列表,但如果我压缩其中的10个,代码将会非常长.有没有可能重构它?或者我需要其他解决方案而不是Zip功能?



1> Anton Gogole..:

在一些代码生成的帮助下(想想T4),可以产生多达6个重载(因为Tuple限制为7个泛型参数)类似于:

public static class Iterate
{
    public static IEnumerable> Over(IEnumerable t1s, IEnumerable t2s, IEnumerable t3s)
    {
        using(var it1s = t1s.GetEnumerator())
        using(var it2s = t2s.GetEnumerator())
        using(var it3s = t3s.GetEnumerator())
        {
            while(it1s.MoveNext() && it2s.MoveNext() && it3s.MoveNext())
                yield return Tuple.Create(it1s.Current, it2s.Current, it3s.Current);
        }
    }
}

通过这个Iterate类,迭代变得非常简单:

foreach(var t in Iterate.Over(
    new[] { 1, 2, 3 }, 
    new[] { "a", "b", "c" }, 
    new[] { 1f, 2f, 3f }))
{
}

这可以进一步推广(完全丧失类型安全性):

public static IEnumerable Over(params IEnumerable[] enumerables)

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