एक ही प्रकार की वस्तुओं के साथ सूचियों की सूची को किसी एकल सूची में कैसे मिलाएं?


209

सवाल भ्रामक है, लेकिन यह अधिक स्पष्ट है जैसा कि निम्नलिखित कोड में वर्णित है:

   List<List<T>> listOfList;
   // add three lists of List<T> to listOfList, for example
   /* listOfList = new {
        { 1, 2, 3}, // list 1 of 1, 3, and 3
        { 4, 5, 6}, // list 2
        { 7, 8, 9}  // list 3
        };
   */
   List<T> list = null;
   // how to merger all the items in listOfList to list?
   // { 1, 2, 3, 4, 5, 6, 7, 8, 9 } // one list
   // list = ???

निश्चित नहीं है कि क्या यह C # LINQ या लैम्ब्डा का उपयोग करके संभव है?

अनिवार्य रूप से, मैं सूचियों की सूची को कैसे समतल या " समतल " कर सकता हूं ?

जवाबों:


455

SelectMany एक्सटेंशन विधि का उपयोग करें

list = listOfList.SelectMany(x => x).ToList();

73
मुझे आश्चर्य है कि कितने लोगों ने अपने स्वयं के "फ्लैटन" एक्सटेंशन को लिखा है कि यह नहीं पता है कि SelectMany कैसे काम करता है?
जेम्स स्कैच

1
इसके लिए x => x की आवश्यकता क्यों है? मैं आमतौर पर x => x +1 जैसी चीजें देखता हूं लेकिन x => x नहीं।
SwimBikeRun

9
@SwimBikeRun SelectMany का उपयोग एक TS TS स्रोत के IEnumerable को लेने के लिए किया जाता है, सूची में प्रत्येक TSource को IEnumerable की TResults में परिवर्तित करें, फिर उन सभी IEnumerables को एक बड़े भाग में मिलाएं। इस मामले में आपके पास शुरू करने के लिए सूचियों की एक सूची है, इसलिए यदि आप उन्हें TSource से एक IEnumerable TResults के TSource (जो एक IEnumerable TResults का है) से मैप करने के लिए फ़ंक्शन को संक्षिप्त करना चाहते हैं, तो पहचान फ़ंक्शन (x => x) है। यह वास्तव में सिर्फ एक विशेष मामला है जहां आपको प्रत्येक TSource को सूची में बदलने के अतिरिक्त चरण की आवश्यकता नहीं है, क्योंकि यह पहले से ही एक सूची है।
शॉन

@JaredPar हम इस तर्क को सूचीबद्ध करने के लिए लागू कर सकते हैं <सूची <सूची <टी >>>?
Tk1993

4
@TusharKukreti ज़रूर, बस उपयोग करेंlist.SelectMany(x => x.SelectMany(y => y)).ToList();
ब्रैंडन Kramer

13

यहाँ C # एकीकृत सिंटैक्स संस्करण है:

var items =
    from list in listOfList
    from item in list
    select item;

थोड़ा सा भ्रमित, लेकिन अच्छा है। यह कैसे? var आइटम = आइटम से आइटम में (सूची में सूची से सूची का चयन करें) आइटम का चयन करें
David.Chu.ca

4
'डबल से' SelectMany के समान है ... SelectMany शायद LINQ विधियों (या क्वेरी ऑपरेटरों) का सबसे शक्तिशाली है। यह देखने के लिए कि, Google "LINQ SelectMany Monad" और इसके बारे में आप जितना जानना चाहते हैं, उससे अधिक की खोज करेंगे।
रिचर्ड एंथनी हेन

3
"LINQ SelectMany Monad" को गुगली करते समय उद्धरणों को शामिल न करें या यह आपको यहाँ वापस ले जाए।
ऑक्सिन

12

क्या आपका यह मतलब है?

var listOfList = new List<List<int>>() {
    new List<int>() { 1, 2 },
    new List<int>() { 3, 4 },
    new List<int>() { 5, 6 }
};
var list = new List<int> { 9, 9, 9 };
var result = list.Concat(listOfList.SelectMany(x => x));

foreach (var x in result) Console.WriteLine(x);

का परिणाम: 9 9 9 1 2 3 4 5 6


या आप मौजूदा सूची में मर्ज किए गए आइटम को जोड़ने के लिए Concatat () के बजाय list.AddRange () का उपयोग कर सकते हैं।
डेहल्बेक

1

के लिए List<List<List<x>>>और इतने पर, का उपयोग करें

list.SelectMany(x => x.SelectMany(y => y)).ToList();

यह एक टिप्पणी में पोस्ट किया गया है, लेकिन यह मेरी राय में एक अलग उत्तर के योग्य है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.