加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 迭代多个列表

发布时间:2020-12-15 18:20:05 所属栏目:百科 来源:网络整理
导读:鉴于一堆列表,我需要同时迭代它们.假设我有三个:list1,list2和list3. 到目前为止我发现的是: foreach (var tuple in list1.Zip(list2,(first,second) = new { object1 = first,object2 = second }) .Zip(list3,second) = new { object1 = first.object1,ob
鉴于一堆列表,我需要同时迭代它们.假设我有三个:list1,list2和list3.

到目前为止我发现的是:

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

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

解决方法

在一些代码生成的帮助下(想想T4),可以产生多达6个重载(因为Tuple限制为7个泛型参数)类似于:
public static class Iterate
{
    public static IEnumerable<Tuple<T1,T2,T3>> Over<T1,T3>(IEnumerable<T1> t1s,IEnumerable<T2> t2s,IEnumerable<T3> 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<object[]> Over(params IEnumerable[] enumerables)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读