2010-05-11 7 views
5

अन्य भाषाओं (रूबी, अजगर, ...) मैं zip(list1, list2) जो इस तरह काम करता है का उपयोग कर सकते हैं:क्या लिंक/.NET3.5 एक 'ज़िप' विधि का समर्थन करता है?

हैं list1 is {1,2,3,4} और list2 is {a,b,c}

तो zip(list1, list2) वापसी होगी: {(1,a), (2,b), (3,c), (d,null)}

ऐसी पद्धति उपलब्ध है .NET के लिंक एक्सटेंशन में?

उत्तर

12

.NET 4 हमें Zip विधि देता है लेकिन यह .NET 3.5 में उपलब्ध नहीं है। यदि आप उत्सुक हैं, Eric Lippert provides an implementation of Zip जो आप उपयोगी पा सकते हैं।

+0

कि नीचे एक कार्यान्वयन के साथ उत्तर दिया करता – katbyte

+0

@Steven: नहीं, यह नहीं करता है: http://referencesource.microsoft.com/#System.Core/ 'लापता मूल्य' व्यवहार को ध्यान में रखते हुए सिस्टम/लिंक/एन्यूमेरेबल सीएस, 2b8d0f02389aab71 – Heinzi

0

न तो कार्यान्वयन गुम मूल्यों में भर जाएगा (या जांचें कि लंबाई समान हैं) जैसा कि सवाल पूछा गया था।

यहाँ एक कार्यान्वयन है कि कर सकते हैं है:

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult> (this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> selector, bool checkLengths = true, bool fillMissing = false) { 
     if (first == null) { throw new ArgumentNullException("first");} 
     if (second == null) { throw new ArgumentNullException("second");} 
     if (selector == null) { throw new ArgumentNullException("selector");} 

     using (IEnumerator<TFirst> e1 = first.GetEnumerator()) { 
      using (IEnumerator<TSecond> e2 = second.GetEnumerator()) { 
       while (true) { 
        bool more1 = e1.MoveNext(); 
        bool more2 = e2.MoveNext(); 

        if(! more1 || ! more2) { //one finished 
         if(checkLengths && ! fillMissing && (more1 || more2)) { //checking length && not filling in missing values && ones not finished 
          throw new Exception("Enumerables have different lengths (" + (more1 ? "first" : "second") +" is longer)"); 
         } 

         //fill in missing values with default(Tx) if asked too 
         if (fillMissing) { 
          if (more1) { 
           while (e1.MoveNext()) { 
            yield return selector(e1.Current, default(TSecond));   
           } 
          } else { 
           while (e2.MoveNext()) { 
            yield return selector(default(TFirst), e2.Current);   
           } 
          } 
         } 

         yield break; 
        } 

        yield return selector(e1.Current, e2.Current); 
       } 
      } 
     } 
    } 
+0

+1। हालांकि, यह मेरे हिस्से में एक त्रुटि है - ऐसा लगता है कि [पायथन का 'ज़िप' फ़ंक्शन] (http://docs.python.org/2/library/functions.html#zip) * भी * अंत तक पहुंचने पर रोकता है इसका * सबसे छोटा * तर्क, बस लिंक संस्करण की तरह। (और मेरी धारणा - प्रश्न में दिखाया गया - गलत था) –

+0

यह एक ज़िप फ़ंक्शन के लिए अजीब है, इसलिए यह डिफ़ॉल्ट नहीं है। लेकिन मेरे पास कुछ स्थितियां थीं जो वांछनीय थीं। – katbyte