在可能无限序列C#元素的耦合上应用选择器

时间:2015-01-22 19:38:26

标签: c# extension-methods ienumerable yield-return

我必须实现扩展方法

public static IEnumerable<TResult> MyMerge<T1, T2, TResult>(this IEnumerable<T1> s1, IEnumerable<T2> s2, Func<T1, T2, TResult> f)

返回序列f(x1,y1),f(x2,y2)...其中所有xn是s1的元素,所有yn是s2的元素。

我的问题是这个序列必须具有相同长度的最短序列,并且s1和s2都可以是无限的。如果不是这样我就能做到

var res = new List<TResult>();
for (var i = 0; i<Math.Min(s1.Count(), s2.Count()) ; i++)
{
    res.Add(f(s1.ToArray()[i], s2.ToArray()[i]));
}
return res;

但是当一个序列比另一个序列长时,这也会破坏。我怎么解决这个问题?

1 个答案:

答案 0 :(得分:5)

.NET已经实现了此完全功能,Enumerable.Zip

至于如何实现它,如果你想自己做,那就相当简单了。为每个可枚举项获取IEnumerator,而两个都有另一个值,将结果选择器应用于两个当前值和yield结果。