我按如下方式执行了两个序列的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。
答案 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);
}
}
}