Dot Net 3.0中的Enumerable.Zip替代解决方案

时间:2017-11-07 14:09:10

标签: c# .net linq .net-3.0

我想知道Dot Net 3.0中有Enumerable.Zip可用的替代解决方案。

以下是我要实现的示例:

我有两个字符串列表。

var list1 = new string[] { "1", "2", "3" };
var list2 = new string[] { "a", "b", "c" };

我想组合这些列表,以这种方式返回如下输出:

{(1,a), (2,b), (3,c)}

我知道,我可以在Dot Net> = 4.0中使用Zip。用这种方式:

list1.Zip(list2, (x, y) => new Tuple<int, string>(x, y));

但是,我的问题是我想在Dot Net 3.0中做同样的事情。 是否有任何替代方法可用于Dot Net&lt; = 3.0或我要创建自定义方法?

1 个答案:

答案 0 :(得分:1)

如您所知,它在.NET 3.5及其旧版本中不可用。然而,Eric Lippert在https://blogs.msdn.microsoft.com/ericlippert/2009/05/07/zip-me-up/发布了它的实现:

  

这样做的代码非常简单;如果您在C#3.0中碰巧需要这个,我将源代码放在下面。

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>
    (this IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    Func<TFirst, TSecond, TResult> resultSelector)
{
    if (first == null) throw new ArgumentNullException("first");
    if (second == null) throw new ArgumentNullException("second");
    if (resultSelector == null) throw new ArgumentNullException("resultSelector");
    return ZipIterator(first, second, resultSelector);
}

private static IEnumerable<TResult> ZipIterator<TFirst, TSecond, TResult>
    (IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    Func<TFirst, TSecond, TResult> resultSelector)
{
    using (IEnumerator<TFirst> e1 = first.GetEnumerator())
        using (IEnumerator<TSecond> e2 = second.GetEnumerator())
            while (e1.MoveNext() && e2.MoveNext())
                yield return resultSelector(e1.Current, e2.Current);
}