2012-02-17 17 views
96

मैं अक्सर खोज करने और पहले तत्व को पकड़ने के लिए Where.FirstOrDefault() का उपयोग करके लोगों को देखता हूं। क्यों न केवल Find() का उपयोग करें? क्या दूसरे के लिए कोई फायदा है? मैं एक अंतर नहीं बता सका।खोजें() बनाम कहां()। FirstOrDefault()

namespace LinqFindVsWhere 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<string> list = new List<string>(); 
      list.AddRange(new string[] 
      { 
       "item1", 
       "item2", 
       "item3", 
       "item4" 
      }); 

      string item2 = list.Find(x => x == "item2"); 
      Console.WriteLine(item2 == null ? "not found" : "found"); 
      string item3 = list.Where(x => x == "item3").FirstOrDefault(); 
      Console.WriteLine(item3 == null ? "not found" : "found"); 
      Console.ReadKey(); 
     } 
    } 
} 
+33

एफडब्ल्यूआईडब्लू, 'सूची। फर्स्टऑर्डडिफॉल्ट (x => x == "item3"); '' वहाँ 'और 'FirstOrDefault' दोनों का उपयोग करने से अधिक संक्षिप्त है। –

+0

@ किर्क, मुझे लगता है कि मेरा अगला प्रश्न यह होगा कि उन्होंने बिल्कुल खोज क्यों जोड़ा। यह एक अच्छी टिप है। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि फर्स्टऑर्डडिल्ट नल के अलावा एक अलग डिफ़ॉल्ट मान वापस कर सकता है। अन्यथा यह एक व्यर्थ जोड़ के समान लगता है। – KingOfHypocrites

+6

'ढूँढें' LINQ को पूर्ववत करता है। (यह .NET 2.0 में उपलब्ध था और आप lambdas का उपयोग नहीं कर सके। आपको सामान्य तरीकों या अज्ञात विधियों का उपयोग करने के लिए मजबूर किया गया था) –

उत्तर

138

IEnumerable<T> पर Find विधि कहां है? (आलंकारिक सवाल।)

Where और FirstOrDefault तरीकों दृश्यों, अनेक प्रकार के सहित List<T>, T[], Collection<T>, आदि कोई भी क्रम कि IEnumerable<T> लागू करता है इन पद्धतियों का उपयोग कर सकते हैं, के खिलाफ लागू होते हैं। Find केवल List<T> के लिए उपलब्ध है। आमतौर पर अधिक लागू होने वाले तरीके, पुन: प्रयोज्य और अधिक प्रभाव पड़ते हैं।

मुझे लगता है कि मेरा अगला प्रश्न यह होगा कि उन्होंने बिल्कुल खोज क्यों जोड़ा। यह एक अच्छी टिप है। एकमात्र चीज जो मैं सोच सकता हूं वह यह है कि फर्स्टऑर्डडिल्ट नल के अलावा एक अलग डिफ़ॉल्ट मान वापस कर सकता है। अन्यथा यह सिर्फ एक व्यर्थ अलावा

List<T> पर Find से पहले अन्य तरीकों की तरह लगता है। List<T> जेनेटिक्स के साथ .NET 2.0 में जोड़ा गया था, और Find उस कक्षा के लिए API का हिस्सा था। Where और FirstOrDefault को लिंक के साथ IEnumerable<T> के लिए एक्सटेंशन विधियों के रूप में जोड़ा गया था, जो बाद में .NET संस्करण है। मैं निश्चित रूप से यह नहीं कह सकता कि यदि लिंक 2.0 रिलीज के साथ अस्तित्व में है तो Find कभी नहीं जोड़ा जाएगा, लेकिन यह तर्कसंगत रूप से कई अन्य सुविधाओं के मामले में है जो पहले .NET संस्करणों में आए थे जिन्हें बाद के संस्करणों द्वारा अप्रचलित या अनावश्यक बनाया गया था।

+0

उत्कृष्ट उत्तर। धन्यवाद। – KingOfHypocrites

+50

बस पूरक करने के लिए: कहां और प्रथम या फर्स्टऑरडिफॉल्ट को कॉल करने की कोई आवश्यकता नहीं है: या तो पहले या फर्स्टऑर्डडिफॉल्ट आपको एक खोज अनुमान निर्दिष्ट करने की अनुमति देता है, जहां कॉल अनावश्यक –

22

Find, केवल List<T> में implemented है, जबकि सभी IEnumerable<T> साथ Where().FirstOrDefault() काम करता है।

34

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

+5

कहां बनाते हैं, आपने इसे कहां और FirstOrDefault के साथ आजमाया था? यदि आपने शायद इसे केवल प्रथमऑर्डडिफॉल्ट के साथ आजमाया है और देखें कि खोजें() अभी भी बेहतर है या नहीं। – MVCKarl

+1

@MVCKarl कृपया देखें [यहां] (http://stackoverflow.com/questions/14032709/performance-of-find-vs-firstordefault)। खोज लगभग दो बार वास्तव में तेज है।लेकिन मुझे यह पता नहीं लगाया जा सकता है कि यह केवल गणनाकर्ता ओवरहेड के कारण नहीं है? –

+3

ऐसा लगता है कि आपने वास्तव में क्वेरी को निष्पादित करने के लिए 'टोलीस्ट() 'या' .ToArray() 'के साथ परिणाम को पूरा नहीं किया है। –

12

डेटा का स्रोत इकाई फ्रेमवर्क: Find को 'जोड़ा' स्थिति में इकाइयां मिलेंगी जो अभी तक जारी नहीं हैं, लेकिन Where नहीं होगा। यह डिजाइन द्वारा है।

संबंधित मुद्दे