में लिस्टिंग सूचियां यदि मेरे पास IEnumerable<List<string>>
प्रकार का चर है तो क्या LINQ कथन या लैम्ब्डा अभिव्यक्ति मैं उस पर लागू कर सकता हूं जो IEnumerable<string>
लौटने वाली सूचियों को जोड़ देगा?लैम्ब्डा/LINQ
उत्तर
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;
}
}
}
हालांकि यह कुछ हद तक सरलीकृत है।
वास्तव में एक भी विधि कॉल, लेकिन आप को लिखने के लिए सक्षम होना चाहिए
var concatenated = from list in lists from item in list select item;
कहाँ सूचियों 'है, आपका IEnumerable<List<string>>
और concatenated प्रकार IEnumerable<string>
की है।
(तकनीकी तौर पर इस है SelectMany
के लिए एक एकल विधि कॉल -। यह सिर्फ नहीं लगती है जैसे कि यह सब मैं प्रारंभिक वक्तव्य का मतलब था बस स्पष्ट करने के लिए है कि ऊपर के मामले में किसी को भी भ्रमित या टिप्पणी की हो गई चाहता था - मैंने महसूस किया पोस्ट करने के बाद मैं इसे पढ़ सकता था)।
एक साधारण विधि बनाएं। LINQ के लिए कोई ज़रूरत नहीं:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
LINQ अभिव्यक्ति का उपयोग करना ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... बस ठीक काम करता है। :-)
b
IEnumerable<string>
और a
string
होगा।
यहां एक और LINQ क्वेरी समझ है।
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;
myStrings.SelectMany(x => x)
अच्छा समाधान, छोटे टाइपो –
धन्यवाद के साथ। टाइपो अपडेट किया गया – JaredPar
और कोई कारण नहीं आप .NET 3.5 (जिसे हम ओपी से ग्रहण कर सकते हैं) प्रयोग कर रहे हैं इसका इस्तेमाल करने के लिए नहीं, या .NET 2.0 और LinqBridge साथ सी # 3.0 कैसे। –
@Marc: आप सही हैं, खासकर अगर एक आसान "linqish" तरीका है। कभी-कभी लोग LINQ तरीके से कुछ करने के लिए कड़ी मेहनत करते हैं और सरल चीजों को समझने में कठोर बनाते हैं। – VVS