2012-09-28 28 views
6

thể trùng lặp:
Create Items from 3 collections using LinqLàm thế nào để sử dụng Zip trên ba IEnumerables

Tôi đã thực hiện một zippage của hai chuỗi như sau.

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

Bây giờ, tôi mới nhận ra rằng tôi sẽ sử dụng ba chuỗi, không phải hai. Vì vậy, tôi đã cố gắng thiết kế lại mã cho một cái gì đó như thế này:

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

Tất nhiên, nó không hoạt động. Có cách nào để triển khai Zip để kết hợp những gì tôi đang nhắm tới không? Có phương pháp nào khác để sử dụng như vậy không? Tôi sẽ phải nén hai chuỗi và sau đó nén chúng với giải nén thứ ba trong quá trình này?

Tại thời điểm này, tôi sắp tạo một cấu trúc đơn giản foryield return. Tôi có nên không? Tôi có thể sử dụng .Net 4.

+0

tương tự: http://stackoverflow.com/questions/5284315/create-items-from-3-collections-using-linq – AakashM

+0

@AakashM: Tôi nghĩ đó không phải là chỉ tương tự, đó là một trùng lặp. –

+0

@ Vì vậy, tôi thấy, điều này là về mảng có một chỉ mục nhanh như 'List's trong liên kết, do đó, có cùng một giải pháp áp dụng. Vẫn chưa có câu hỏi thú vị về việc phải làm gì với một 'IEnumerable <>' tùy ý ... – AakashM

Trả lời

10

Bạn có thể sử dụng hai cuộc gọi đến số Zip hiện tại (có thể hơi lộn xộn một chút, nhưng nó sẽ hoạt động) hoặc bạn chỉ có thể thực hiện Zip của riêng mình.

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

Câu trả lời hay, ngoại trừ tôi sẽ đổi tên phương thức thành 'PerformZippage' –

Các vấn đề liên quan