2010-03-24 15 views
7

मैं एक अंकीय प्रकार की दो सूचियां जोड़ना चाहते हैं ऐसी है कि addedList [x] = listOne [x] + listTwo [x]मैं लिंक में दो सूचियों को कैसे जोड़ूं ताकि जोड़ा गया [x] = listOne [x] + listTwo [x]?

सूची के उत्पादन में एक Generic.IEnumerable है कि मैं में उपयोग कर सकते हैं की जरूरत है भावी linq प्रश्न।

जबकि मैं नीचे दिए गए कोड का उपयोग करके इसे करने में सक्षम था, मैं मदद नहीं कर सकता लेकिन ऐसा लगता है कि एक बेहतर तरीका होना चाहिए। कोई विचार?

List<int> firstList = new List<int>(new int[] { 1, 3, 4, 2, 5, 7, 2, 5, 7, 8, 9, 0 }); 
List<int> secondList = new List<int>(new int[] { 4, 6, 8, 3, 1, 5, 9, 3, 0 }); 

int findex = 0; 

ILookup<int, int> flookup = firstList.ToLookup(f => 
          { 
           int i = findex; 
           findex++; 
           return i; 
           }, p => p); 

var listsAdded = from grp in flookup 
       select grp.First() + secondList.ElementAtOrDefault(grp.Key); 

foreach (int i in listsAdded) 
    Console.WriteLine(i); 
+0

क्या होता है जब दूसरी सूची पहले से अधिक लंबी होती है? – Gabe

+0

@gabe - नीचे मेरा समाधान देखें, यह विभिन्न लंबाई की सूचियों को संभालता है। –

उत्तर

3
var result = 
    from i in 
     Enumerable.Range(0, Math.Max(firstList.Count, secondList.Count)) 
    select firstList.ElementAtOrDefault(i) + secondList.ElementAtOrDefault(i); 
+0

यह वही है जो मैं ढूंढ रहा था। धन्यवाद आर्टम। – Audie

+0

चेतावनी - यह दृष्टिकोण बहुत अक्षम हो सकता है - खासकर किसी भी महत्वपूर्ण आकार की सूचियों के लिए। 'ElementAtOrDefault' के लिए प्रत्येक कॉल को शुरुआत से सूची के माध्यम से फिर से शुरू करने की आवश्यकता हो सकती है। 100 तत्वों की दो सूचियों को जोड़कर 200 की बजाय 10,100 तत्वों को फिर से शुरू करने की लागत लग सकती है। 1000 तत्वों के लिए यह 1,001,000 तत्व बन जाता है। और यह वहां से भी बदतर हो जाता है ... – Enigmativity

+2

@ निष्क्रियता, यह संदर्भ में सही नहीं है। इस बात को ध्यान में रखते हुए कि ElementAtOrDefault को सूची के लिए बुलाया जाता है (सूची में IList ) - सूची का आकार वास्तव में कोई फर्क नहीं पड़ता क्योंकि ElementAtOrDefault (अनुक्रमणिका) आंतरिक रूप से सूची [इंडेक्स] कह रहा है जो इंडेक्स द्वारा आंतरिक आंतरिक सरणी को एक्सेस करता है, इसलिए पहुंच ओ है (1) और आप कुछ भी नहीं कह रहे हैं। ElementAtOrDefault व्यवहार कर सकता है जैसा कि आपने उन IENumerable के लिए इंगित किया है जो IList प्रकार के नहीं हैं (लेकिन यह इस प्रश्न का मामला नहीं है)। –

0
var res = list.Concat(list1); 

संयोजित दो सूचियों, अंतिम डुप्लिकेट भी शामिल है।

var res = list.Union(list1); 

दो सूचियों को जोड़ता है, बिना डुप्लीकेट के परिणाम प्रदान करता है।

3

ऐसा लगता है कि आप इस तरह से एक समारोह चाहते हैं:

public static IEnumerable<int> SumIntLists( 
    this IEnumerable<int> first, 
    IEnumerable<int> second) 
{ 
    using(var enumeratorA = first.GetEnumerator()) 
    using(var enumeratorB = second.GetEnumerator()) 
    { 
     while (enumeratorA.MoveNext()) 
     { 
      if (enumeratorB.MoveNext()) 
       yield return enumeratorA.Current + enumeratorB.Current; 
      else 
       yield return enumeratorA.Current; 
     } 
     // should it continue iterating the second list? 
     while (enumeratorB.MoveNext()) 
      yield return enumeratorB.Current; 
    } 
} 
+0

धन्यवाद गेबे। यह एक विस्तार का एक उत्कृष्ट उदाहरण है जो मेरी समस्या का समाधान करेगा। मैं आर्टिम के रूप में विस्तार के बिना ऐसा करने में सक्षम होने की उम्मीद करता था। आपका एक्सटेंशन उदाहरण यद्यपि निर्देशक था, और मुझे अलग-अलग सूची की लंबाई को संभालने का तरीका पसंद आया। आपकी सहायता के लिए धन्यवाद. – Audie

15

क्या आप देख रहे हैं एक ज़िप तरीका है। यह विधि आपको प्रक्षेपण लागू करके एक ही सूची में बराबर लंबाई की सूचियों को गठबंधन करने की अनुमति देती है।

उदाहरण के लिए

var sumList = firstList.Zip(secondList, (x,y) => x + y).ToList(); 

इस विधि CLR 4.0 (Reference) में बीसीएल को जोड़ा गया है। हालांकि यह लागू करने के लिए काफी सीधे आगे है और कई संस्करण ऑनलाइन उपलब्ध हैं जिन्हें 2.0 या 3.5 एप्लिकेशन में कॉपी किया जा सकता है।

+0

ज़िप अलग-अलग आकारों को कैसे संभालता है? – Gabe

+0

@gabe, विभिन्न कार्यान्वयन अलग-अलग मार्ग लेते हैं। बीसीएल संस्करण लंबी सूची में अतिरिक्त तत्वों को अनदेखा कर देगा, लेकिन सूची को विस्तारित करने वाली एक अलग विधि लिखना काफी आसान है। – JaredPar

संबंधित मुद्दे