C # में Select और ConvertAll के बीच अंतर


117

मेरे पास कुछ सूची है:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };

मैं अपनी सूची के तत्वों में कुछ परिवर्तन लागू करना चाहता हूं। मैं इसे दो तरीकों से कर सकता हूं:

List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();

इन दोनों तरीकों में क्या अंतर है?


16
आपको ConvertAll () के बाद .TLList () की आवश्यकता नहीं है।
Gleno

ConvertAll के बारे में कभी नहीं सुना, आज कुछ नया पता चला
अमित बिष्ट

जवाबों:


117

Selectएक LINQ एक्सटेंशन विधि है और सभी IEnumerable<T>वस्तुओं पर काम करता है जबकि ConvertAllकेवल द्वारा कार्यान्वित किया जाता है List<T>ConvertAllविधि .NET 2.0 के बाद से मौजूद है जबकि LINQ 3.5 के साथ पेश किया गया था।

आप के पक्ष में होना चाहिए Selectसे अधिक ConvertAllके रूप में यह सूची के किसी भी प्रकार के लिए काम करता है, लेकिन वे मूल रूप से एक ही है।


7
और प्रदर्शन के बारे में क्या? यदि मेरे पास सूची है, तो क्या ConvertAll या Select का उपयोग करना अधिक प्रदर्शनकारी है?
निकोलस

@ निकोलस: कुल निष्पादन का समय लगभग एक ही है, लेकिन वे प्रसंस्करण अलग तरीके से करते हैं इसलिए वे अलग-अलग बैठने के लिए फिट होते हैं। मैंने अपने उत्तर में इसके बारे में कुछ जोड़ा।
गुफा जूल

3
आप तुलना नहीं कर सकते हैं Selectऔर ConvertAll। पूर्व प्रत्येक आइटम को एक क्रम में चुनता है और आप इसके साथ जो भी करना चाहते हैं, करने के लिए स्वतंत्र हैं। उत्तरार्द्ध का एक स्पष्ट इरादा है: इस आइटम को कुछ और में परिवर्तित करें।
टिम शाल्टर 13

1
अंतःक्रियात्मक रूप से, सूची <T> वर्ग में कई विधियाँ हैं, जो LINQ में लगभग सटीक मेल खाती हैं। अस्तित्व -> कोई भी, खोजें -> पहले, FindAll -> कहाँ, FindLast -> अंतिम, TrueForAll -> सभी
मिकाल

ConvertAll और Select के बीच अंतर ConvertAll है जो हाथ से पहले सूची के आकार को आवंटित करेगा। एक बड़े अनुक्रम के लिए यह एक प्रदर्शन अंतर बनाएगा। इस प्रकार, यदि प्रदर्शन आपका उद्देश्य है, तो ConvertAll का उपयोग करें। यदि प्रदर्शन चिंता का विषय नहीं है, तो भाषा में अधिक मुहावरेदार का चयन करें का उपयोग करें और बताता है कि भविष्य के पाठकों का प्रदर्शन चिंता का विषय नहीं था।
डर्ड़सॉफ्ट

82

ConvertAllविस्तार नहीं है, यह सूची वर्ग में एक विधि है। आपको ToListपरिणाम पर कॉल करने की आवश्यकता नहीं है क्योंकि यह पहले से ही एक सूची है:

List<int> list2 = list.ConvertAll(x => 2 * x);

तो, अंतर यह है कि ConvertAllविधि का उपयोग केवल एक सूची में किया जा सकता है, और यह एक सूची देता है। इस Selectपद्धति का उपयोग किसी भी संग्रह पर किया जा सकता है जो IEnumerable<T>इंटरफ़ेस को लागू करता है, और यह एक रिटर्न देता है IEnumerable<T>

इसके अलावा, वे अलग तरह से प्रसंस्करण करते हैं, इसलिए विभिन्न स्थितियों में उनकी ताकत होती है। ConvertAllजबकि सूची के माध्यम से विधि रन और, एक ही बार में एक नई सूची बनाता Selectविधि आलसी निष्पादन का उपयोग करता है और के रूप में आप उन्हें जरूरत केवल आइटम संसाधित करता है। यदि आपको सभी आइटम की आवश्यकता नहीं है, तो Selectविधि अधिक कुशल है। दूसरी ओर, एक बार ConvertAllसूची वापस आ जाने के बाद, आपको मूल सूची रखने की आवश्यकता नहीं है।


यकीनन, किसी को "मूल सूची रखने" की आवश्यकता नहीं है: यह जीसी द्वारा आवश्यकतानुसार किया जाएगा।
user2864740

8
@ user2864740: हाँ, यह सच है अगर स्रोत सख्ती से स्मृति में एक सूची है। यदि इसे उदाहरण के लिए किसी फ़ाइल से पढ़ा जाता है, तो आपको फ़ाइल को तब तक खुला रखने की आवश्यकता है जब तक कि आप परिणाम को संसाधित नहीं कर लेते Select
गुफा

19

पहले उत्तर को स्वीकार नहीं किया जाना चाहिए। मैं पूर्व 2007 C # Microsoft MVP हूं।

स्वीकृत प्रतिक्रिया के विपरीत, ConvertAllके संयोजन की तुलना में बहुत अधिक कुशल है Selectऔर ToList()

सबसे पहले, ConvertAllसख्ती से तेज है और ऐसा करने के लिए यह न्यूनतम मात्रा में मेमोरी का उपयोग करता है। Array.ConvertAll बनाम Select और ToArray के समान। यह एक बड़ी लंबाई वाली सरणी या लूप के भीतर कई कॉल के साथ अधिक स्पष्ट होगा।

1) ConvertAllअंतिम सूची का आकार जानता है और आधार सरणी को पुन: प्राप्त करने से बचता है। ToList() सरणी को कई बार आकार बदलते रहेंगे।

2) ToListधीमी इंटरफ़ेस IEnumerable<>कॉल ConvertAllकरेगा , जबकि अतिरिक्त कॉल या रेंज चेक के बिना अंतर्निहित सरणी के माध्यम से लूप करेगा।

3) सेलेक्ट करने पर एक्स्ट्रा IEnumerable<T>ऑब्जेक्ट बनेगा ।


1

मुझे पता है कि यह थोड़ा देर से है, लेकिन मैंने अभी भी जोड़ा है क्योंकि यह भविष्य में दूसरों के लिए कुछ काम का हो सकता है।

EntityFramework क्वेरी अभिव्यक्ति में इसका उपयोग करते समय ConvertAll () का उपयोग करने की अनुशंसा नहीं की जाती है क्योंकि यह भविष्य के उपयोग के लिए अभिव्यक्ति के रूप में छोड़ने के बजाय अभिव्यक्ति का मूल्यांकन करता है। यह गंभीरता से डेटाबेस क्वेरी निष्पादन निष्पादन को नीचा दिखाता है क्योंकि इसे अंतिम अभिव्यक्ति का मूल्यांकन करने से पहले कॉल की संख्या करनी होगी।


9
काफी नहीं। जैसा कि गुफ्फा इस जवाब में बताते हैं , ConvertAll यह एक तरीका हैList<T> । जब तक आपके पास सूची होगी, तब तक आप अपनी अभिव्यक्ति का मूल्यांकन कर चुके होते हैं। लेकिन आप सही हैं - यदि आप सभी का मूल्यांकन नहीं करना चाहते हैं, Selectतो बेहतर है।
वाई हा ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.