Dot-Net

.Net 中有類似 zip 的方法嗎?

  • November 17, 2017

在 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);

引用自:https://stackoverflow.com/questions/101174