2012-09-28 15 views
6

可能重複使用郵編:
Create Items from 3 collections using Linq如何在三個IEnumerables

我已經執行如下兩個序列的zippage。

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, (outer, inner) => 
    new Wazoo{P1 = outer, P2 = inner}); 

現在,我才意識到我將使用三個序列,而不是兩個。所以我試圖重新設計這樣的代碼:

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, arr3, (e1, e2, e3) => 
    new Wazoo{P1 = e1, P2 = e2, P3 = e3}); 

當然,它沒有工作。有沒有辦法將Zip部署到我的目標?有沒有其他方法用於這種用法?我會不得不壓縮兩個序列,然後在第三個解壓縮它們的過程中壓縮它們?

此時我即將創建一個簡單的for -loop和yield return請求的結構。我是不是該?我在.net 4上。

+0

相似:http://stackoverflow.com/questions/5284315/create-items-from-3-collections-using-linq – AakashM

+0

@AakashM:我覺得這不只是相似,這是一個重複的。 –

+0

@Ben所以我看到,這個是關於具有快速索引器的數組,像鏈接中的'List's,所以是同一個解決方案適用的。仍然沒有問一個關於如何處理任意IEnumerable <>'的有趣問題...... – AakashM

回答

10

你可以使用兩個調用到現有的Zip(它會有點混亂,但它會工作),或者你可以製作自己的Zip需要3個序列。

public static IEnumerable<TResult> Zip<TFirst, TSecond, TThird, TResult> 
    (this IEnumerable<TFirst> source, IEnumerable<TSecond> second 
    , IEnumerable<TThird> third 
    , Func<TFirst, TSecond, TThird, TResult> selector) 
{ 
    using(IEnumerator<TFirst> iterator1 = source.GetEnumerator()) 
    using(IEnumerator<TSecond> iterator2 = second.GetEnumerator()) 
    using (IEnumerator<TThird> iterator3 = third.GetEnumerator()) 
    { 
     while (iterator1.MoveNext() && iterator2.MoveNext() 
      && iterator3.MoveNext()) 
     { 
      yield return selector(iterator1.Current, iterator2.Current, 
       iterator3.Current); 
     } 
    } 
} 
+1

好的答案,除了我會將該方法重命名爲'PerformZippage' –