7

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

我已经执行了两个序列的压缩,如下所示。

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-loop 和yield return请求的结构。我是不是该?我在.Net 4上。

4

1 回答 1

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);
        }
    }
}
于 2012-09-28T13:53:49.427 回答