LINQ में समतल सूची


313

मेरे पास एक LINQ क्वेरी है जो वापस आती है, IEnumerable<List<int>>लेकिन मैं केवल वापस लौटना List<int>चाहता हूं इसलिए मैं अपने सभी रिकॉर्ड IEnumerable<List<int>>को केवल एक सरणी में मर्ज करना चाहता हूं ।

उदाहरण :

IEnumerable<List<int>> iList = from number in
    (from no in Method() select no) select number;

मैं अपना सारा परिणाम IEnumerable<List<int>>केवल एक के लिए लेना चाहता हूंList<int>

इसलिए, स्रोत सरणियों से: [1,2,3,4] और [5,6,7]

मुझे केवल एक सरणी चाहिए [1,2,3,4,5,6,7]

धन्यवाद

जवाबों:


567

प्रयत्न SelectMany()

var result = iList.SelectMany( i => i );

8
धन्यवाद, मैं हमेशा इस एक को भूल जाता हूं - मुझे पता है कि यह वहां है, लेकिन मैं हर बार इसके लिए Googling में बहुत अधिक समय बिताता हूं, जब मुझे इसका उपयोग करने की आवश्यकता होती है। इस उत्तर को बुकमार्क करना। :-)
BrainSlugs83

कुछ समय के लिए मुझे डर था कि मैं केवल एक ही था जिसे कभी भी इसकी आवश्यकता थी। धन्यवाद माइक!
अर्नब चक्रवर्ती

7
क्या इसके लिए कुछ वैकल्पिक वाक्यविन्यास है SelectMany( i => i )? मैंने देखा है कि इस वाक्यविन्यास ने बहुत उपयोग किया है, लेकिन यह चुनिंदा सुविधा का एक विकृत उपयोग प्रतीत होता है, इसलिए मैंने भाषा डिजाइनरों से विशेष रूप से सूचियों की सूची के लिए शॉर्टकट सिंटैक्स के साथ आने की उम्मीद की होगी
एंडी

86

क्वेरी सिंटैक्स के साथ:

var values =
from inner in outer
from value in inner
select value;

धन्यवाद सटीक वाक्यविन्यास मैं ढूंढ रहा था, और इतने सारे एसओ जवाब कुछ और क्रिया को सूचीबद्ध करते हैं।
सिल्वरसाइडडाउन

यह SelectMany की तुलना में बहुत बेहतर है। अधिक स्पष्ट रूप से IMO पर क्या चल रहा है, इस बात को इंगित करने के लिए धन्यवाद!
ब्रायन रेनर

3
व्यक्तिगत रूप से मुझे हमेशा क्वेरी सिंटैक्स संस्करण विधि कॉलिंग संस्करण की तुलना में बहुत सहज लगता है। जब रेस्पर लूप्स को LINQ अभिव्यक्तियों में बदलने की पेशकश करता है, अगर यह मुझे क्वेरी सिंटैक्स देता है जो मैं हमेशा पूर्ववत करता हूं।
bikeman868

23
iList.SelectMany(x => x).ToArray()

6
@recursive बाकी सभी को क्या याद आया? .ToArray()? - यह परिस्थितिजन्य है - यदि आपको केवल एक बार पुनरावृति करने की आवश्यकता है - या यदि आइटम बदलने की संभावना है, तो .ToArray()निश्चित रूप से वह नहीं है जो आप चाहते हैं। लेकिन स्थिर वस्तुओं के साथ जो आप कई बार एनुमरेट करने जा रहे हैं, .ToList()या .ToArray()एक प्रदर्शन में सुधार (थोड़ी अधिक मेमोरी उपयोग की लागत पर, जो आमतौर पर एक बहुत अच्छा सौदा है) देगा।
BrainSlugs83

2
वर्तमान में इस मामले में परिस्थितियों को सरणियों की आवश्यकता है, क्योंकि यह प्रश्न में निर्दिष्ट किया गया था।
पुनरावर्ती

8
@ व्यापक, अगर हम नाइटपैकिंग कर रहे हैं, तो ओपी कहता है कि उसे वापस जाने की जरूरत है List<int>, इसलिए .ToList()फिर सही विकल्प होगा।
मेमोरियल

@MEMark ओपी में "केवल एक सरणी के लिए" कहा गया है
स्टीफनजेंसन


11

यदि आपके पास है List<List<int>> kतो आप कर सकते हैं

List<int> flatList= k.SelectMany( v => v).ToList();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.