我想知道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或我要创建自定义方法?
答案 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);
}