如何在三个IEnumerables上使用Zip

时间:2012-09-28 13:22:42

标签: c# linq

  

可能重复:
  Create Items from 3 collections using Linq

我按如下方式执行了两个序列的zippage。

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, (outer, inner) =>
  new Wazoo{P1 = outer, P2 = inner});

现在,我意识到我将使用三个序列,而不是两个。所以我尝试将代码重新设计为:

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, arr3, (e1, e2, e3) =>
  new Wazoo{P1 = e1, P2 = e2, P3 = e3});

当然,它没有用。有没有办法部署Zip来整合我的目标?这种用法还有其他方法吗?我是否必须压缩其中的两个序列,然后将第三个序列拉链并将其解压缩?

此时我即将创建一个简单的for - 循环和yield return请求的结构。我是不是该?我在.Net 4。

1 个答案:

答案 0 :(得分:11)

您可以使用对现有Zip的两次调用(它会有点乱,但它会起作用)或者您可以创建自己的Zip,它需要3个序列。

public static IEnumerable<TResult> Zip<TFirst, TSecond, TThird, TResult>
    (this IEnumerable<TFirst> source, IEnumerable<TSecond> second
    , IEnumerable<TThird> third
    , Func<TFirst, TSecond, TThird, TResult> selector)
{
    using(IEnumerator<TFirst> iterator1 = source.GetEnumerator())
    using(IEnumerator<TSecond> iterator2 = second.GetEnumerator())
    using (IEnumerator<TThird> iterator3 = third.GetEnumerator())
    {
        while (iterator1.MoveNext() && iterator2.MoveNext()
            && iterator3.MoveNext())
        {
            yield return selector(iterator1.Current, iterator2.Current,
                iterator3.Current);
        }
    }
}