2008-09-29 17 views
15

में लिस्टिंग सूचियां यदि मेरे पास IEnumerable<List<string>> प्रकार का चर है तो क्या LINQ कथन या लैम्ब्डा अभिव्यक्ति मैं उस पर लागू कर सकता हूं जो IEnumerable<string> लौटने वाली सूचियों को जोड़ देगा?लैम्ब्डा/LINQ

उत्तर

31

SelectMany - यानी

 IEnumerable<List<string>> someList = ...; 
     IEnumerable<string> all = someList.SelectMany(x => x); 

someList में प्रत्येक आइटम के लिए, यह तो लैम्ब्डा का उपयोग करता है "x => x" आंतरिक मदों के लिए एक IEnumerable < टी > मिलता है। इस मामले में, प्रत्येक "एक्स" एक सूची < टी > है, जो पहले से ही IENumerable < टी > है।

ये तब एक संगत ब्लॉक के रूप में लौटाए जाते हैं। अनिवार्य रूप से, SelectMany कुछ ऐसा है (सरलीकृत):

static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, IEnumerable<TResult>> selector) { 

    foreach(TSource item in source) { 
     foreach(TResult result in selector(item)) { 
     yield return result; 
     } 
    } 
} 

हालांकि यह कुछ हद तक सरलीकृत है।

2

वास्तव में एक भी विधि कॉल, लेकिन आप को लिखने के लिए सक्षम होना चाहिए

var concatenated = from list in lists from item in list select item; 

कहाँ सूचियों 'है, आपका IEnumerable<List<string>> और concatenated प्रकार IEnumerable<string> की है।

(तकनीकी तौर पर इस है SelectMany के लिए एक एकल विधि कॉल -। यह सिर्फ नहीं लगती है जैसे कि यह सब मैं प्रारंभिक वक्तव्य का मतलब था बस स्पष्ट करने के लिए है कि ऊपर के मामले में किसी को भी भ्रमित या टिप्पणी की हो गई चाहता था - मैंने महसूस किया पोस्ट करने के बाद मैं इसे पढ़ सकता था)।

0

एक साधारण विधि बनाएं। LINQ के लिए कोई ज़रूरत नहीं:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists) 
{ 
    foreach (List<string> list in lists) 
    foreach (string item in list) 
    { 
    yield return item; 
    } 
} 
+0

और कोई कारण नहीं आप .NET 3.5 (जिसे हम ओपी से ग्रहण कर सकते हैं) प्रयोग कर रहे हैं इसका इस्तेमाल करने के लिए नहीं, या .NET 2.0 और LinqBridge साथ सी # 3.0 कैसे। –

+0

@Marc: आप सही हैं, खासकर अगर एक आसान "linqish" तरीका है। कभी-कभी लोग LINQ तरीके से कुछ करने के लिए कड़ी मेहनत करते हैं और सरल चीजों को समझने में कठोर बनाते हैं। – VVS

0

LINQ अभिव्यक्ति का उपयोग करना ...

IEnumerable<string> myList = from a in (from b in myBigList 
             select b) 
          select a; 

... बस ठीक काम करता है। :-)

bIEnumerable<string> और astring होगा।

0

यहां एक और LINQ क्वेरी समझ है।

IEnumerable<string> myStrings = 
    from a in mySource 
    from b in a 
    select b; 
7

के बारे में
myStrings.SelectMany(x => x) 
+0

अच्छा समाधान, छोटे टाइपो –

+0

धन्यवाद के साथ। टाइपो अपडेट किया गया – JaredPar