Dot-Net
.Net 中有類似 zip 的方法嗎?
在 Python 中有一個非常簡潔的函式被呼叫
zip,它可以用來同時遍歷兩個列表:list1 = [1, 2, 3] list2 = ["a", "b", "c"] for v1, v2 in zip(list1, list2): print v1 + " " + v2上面的程式碼應該產生以下內容:
1個 2 乙 3℃我想知道.Net中是否有類似的方法?我正在考慮自己編寫它,但如果它已經可用,那就沒有意義了。
更新:它在 C# 4 中作為System.Linq.Enumerable.Zip 方法內置
這是一個 C# 3 版本:
IEnumerable<TResult> Zip<TResult,T1,T2> (IEnumerable<T1> a, IEnumerable<T2> b, Func<T1,T2,TResult> combine) { using (var f = a.GetEnumerator()) using (var s = b.GetEnumerator()) { while (f.MoveNext() && s.MoveNext()) yield return combine(f.Current, s.Current); } }放棄了 C# 2 版本,因為它顯示了它的年齡。
據我所知沒有。我為自己寫了一個(以及一些其他有用的擴展,並將它們放在 Codeplex 上的一個名為NExtension的項目中。
顯然 .NET 的並行擴展具有 Zip 功能。
這是 NExtension 的簡化版本(但請查看更多有用的擴展方法):
public static IEnumerable<TResult> Zip<T1, T2, TResult>(this IEnumerable<T1> source1, IEnumerable<T2> source2, Func<T1, T2, TResult> combine) { using (IEnumerator<T1> data1 = source1.GetEnumerator()) using (IEnumerator<T2> data2 = source2.GetEnumerator()) while (data1.MoveNext() && data2.MoveNext()) { yield return combine(data1.Current, data2.Current); } }用法:
int[] list1 = new int[] {1, 2, 3}; string[] list2 = new string[] {"a", "b", "c"}; foreach (var result in list1.Zip(list2, (i, s) => i.ToString() + " " + s)) Console.WriteLine(result);