LINQ, कहाँ () बनाम FindAll ()


125

क्या कोई समझा सकता है कि LINQ कैसे कार्य करता है (..) और FindAll (..) अलग-अलग हैं? वे दोनों एक ही काम करने लगते हैं ...



जवाबों:


203

FindAll()List<T>प्रकार पर एक समारोह है , यह एक LINQ विस्तार विधि की तरह नहीं है Where। LINQ एक्सटेंशन मेथड्स किसी भी प्रकार पर काम करते हैं जो लागू करता है IEnumerable, जबकि FindAllइसका उपयोग केवल List<T>इंस्टेंस पर किया जा सकता है (या उन वर्गों के उदाहरण जो निश्चित रूप से इसे प्राप्त करते हैं)।

इसके अतिरिक्त, वे वास्तविक उद्देश्य में भिन्न हैं। जब वस्तु की गणना की जाती है तो उसका Whereएक उदाहरण IEnumerableऑन-डिमांड निष्पादित होता है। FindAllएक नया रिटर्न देता List<T>है जिसमें अनुरोधित तत्व होते हैं। FindAllके Where(...).ToList()उदाहरण पर कॉल करना अधिक पसंद है IEnumerable


20

2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95 आलसी (स्थगित) और तत्काल निष्पादन के बीच अंतर की व्याख्या करता है। मूल रूप से, कुछ मामलों में, आपको पूरी सूची की आवश्यकता नहीं है, आप आइटम के माध्यम से लूप करना चाह सकते हैं जब तक कि कुछ होता नहीं है, तब रुकें। यह वह जगह है जहाँ आलसी काम में आता है, लेकिन कार्यान्वयन के आधार पर, अप्रत्याशित परिणाम हो सकता है (सभी लिंक में समझाया गया है)। उम्मीद है की यह मदद करेगा।
नर्ची

10

मेरे लिए सबसे बड़ा अंतर यह है कि .FindAll .Net 2.0 में भी उपलब्ध है। मेरे पास .Net 3.5 में प्रोग्राम करने के लिए हमेशा लक्जरी नहीं है, इसलिए मैं .net जेनेरिक संग्रह के 'मूल' तरीकों को याद रखने की कोशिश करता हूं।

यह कई बार हुआ कि मैंने पहले से ही उपलब्ध सूची पद्धति को स्वयं लागू किया क्योंकि मैं इसे LINQ नहीं कर सका।

इस मामले में मुझे जो काम मिलता है वह है, VS2008 का उपयोग करते हुए, मैं टाइप इंट्रेंस और लैम्ब्डा सिंटैक्स का उपयोग कर सकता हूं । ये कंपाइलर फीचर्स हैं, फ्रेमवर्क फीचर्स नहीं। इसका मतलब है कि मैं इसे लिख सकता हूं और अभी भी .Net 2.0 में बना रहेगा:

var myOddNums = myNums.FindAll(n => n%2==1);

लेकिन यदि आपके पास LINQ उपलब्ध है, तो आस्थगित निष्पादन और तत्काल निष्पादन के बीच अंतर रखना महत्वपूर्ण है।


6

यदि मुझे सही ढंग से याद है, तो मुख्य अंतर (इसके अलावा जो वे पर लागू होते हैं: IEnumerable<T>बनाम List<T>) वह Whereक्रियान्वयन है, जहां वह वास्तव में लुकअप नहीं करता है जब तक आपको इसकी आवश्यकता नहीं होती है - उदाहरण के लिए फॉरच लूप में इसका उपयोग करना। FindAllएक तत्काल निष्पादन विधि है।


3

मैंने 80K ऑब्जेक्ट्स की सूची में कुछ परीक्षण किए और पाया कि Find()एक के Whereसाथ प्रयोग करने से 1000% तक तेज हो सकता है FirstOrDefault()। मुझे नहीं पता था कि प्रत्येक कॉल से पहले और बाद में एक टाइमर का परीक्षण करने तक। कभी-कभी यह एक ही समय था, अन्य बार यह तेज था।


5
क्या आपने संग्रह तक पहुँचने की कोशिश की? Enumerable.Where () स्थगित निष्पादन का उपयोग करता है और संग्रह तक पहुंचने से पहले इसका मूल्यांकन नहीं किया जाता है, जो कि इसके वास्तव में तेज़ होने या न होने पर गलत अवधारणाएं पैदा कर सकता है। फिर भी, यह अधिकांश भाग के लिए है, आमतौर पर स्थैतिक संग्रह (जैसे टाइप <टी> और एरे <>>) के बजाय गणना करने के लिए तेजी से उपयोग किया जाता है।
सेबेस्टियन जॉब Bjørnager जेन्सेन

प्रश्न FindAll के बारे में है। यह स्पष्ट है कि कहां से अधिक तेजी से होगा (सभी मूल्यों को लेते हुए) और FirstOrDefault प्राप्त कर रहा है
विवेक MVK
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.