如何在三个IEnumerables上使用Zip

Kon*_*ten 7 c# linq

可能重复:
使用Linq从3个集合创建项目

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

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

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

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

当然,它没有用.有没有办法部署Zip以实现我的目标?这种用法还有其他方法吗?我是否必须压缩其中的两个序列,然后将第三个序列拉链,并在此过程中解压缩它们?

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

Ser*_*rvy 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)