2011-12-03 15 views
19

संभव डुप्लिकेट:
When to use .First and when to use .FirstOrDefault with LINQ?LINQ में FirstOrDefault के बजाय पहले का उपयोग क्यों करें?

LINQ में First ऑपरेटर का उपयोग, जब आप के बजाय FirstOrDefault ऑपरेटर इस्तेमाल कर सकते हैं की बात क्या है?

var q = results.First(); // Error if empty 
+2

मैं डुप्लिकेट के लिए एक करीबी देख सकता था, लेकिन ... "रचनात्मक नहीं"? :(हालांकि, मुझे लगता है कि सवाल स्पष्टीकरण का उपयोग कर सकता है * क्यों * 'पहला '(त्रुटि-अगर-खाली के साथ) को' FirstOrDefault 'से कम आदर्श माना जाता है। –

उत्तर

17

(क्यों First का उपयोग करता है, तो आप हमेशा FirstOrDefault उपयोग कर सकते हैं), वहाँ मामलों में जहां आप कर रहे हैं अपने विशिष्ट सवाल का सीधा जवाब दें करने के लिए FirstOrDefault का उपयोग नहीं कर सकते, क्योंकि यह जानकारी खो देता है! "डिफ़ॉल्ट मान" स्रोत सूची में एक मान्य तत्व प्रकार की संभावना है। आपके पास गणना में पहले तत्व के बीच अंतर/डिफ़ॉल्ट बनाम गणना के पहले तत्व के बीच अंतर करने का कोई तरीका नहीं है जब तक कि आप First का उपयोग न करें या पहले जांचें कि Any तत्व हैं, जिसके लिए डबल-गणना की आवश्यकता है।

यह विशेष रूप से मूल्य-टाइप किए गए एन्यूमेरबल्स, जैसे कि int[] के लिए सच है। default(int)0 है, जो कि सरणी का एक मान्य मान भी है।

सामान्यतः, दो विधियां विभिन्न तार्किक प्रवाह का प्रतिनिधित्व करती हैं। First का उपयोग किया जाएगा यदि कोई तत्व "असाधारण" (एक त्रुटि) नहीं है, जो तब आपके आवेदन में आउट-ऑफ-बैंड को संभालना चाहता है। इस परिदृश्य में, आप कम से कम एक तत्व होने की अपेक्षा करते हैं। FirstOrDefault एक खाली सेट पर शून्य देता है, जिसका अर्थ है कि आपको लौटाए गए मूल्य के साथ अतिरिक्त प्रसंस्करण करने की आवश्यकता है। यह Parse बनाम TryParseint/double/आदि पर विधियों के समान तर्क है। वास्तव में, कुछ तरीकों से आपका प्रश्न स्वयं को अपवादों का उपयोग करने के बारे में अधिक सामान्य प्रश्न के रूप में ले जाता है।

चूंकि First अपवाद फेंकता है, यह अपवाद प्रदान करने वाले सभी कोड-पुन: उपयोग अवसरों के लिए खुद को उधार देता है। उदाहरण के लिए, आप कर सकते हैं:

try 
{ 
    x = arr1.First(); 
    y = arr2.First(); 
    z = arr3.First(); 
} 
catch 
{ 
    throw new ArgumentException(); 
} 
8

स्पष्ट रूप से एक अपवाद बाध्य करने के लिए एक null जांच प्रदर्शन बनाम उठाया पाने के लिए।

2

यह Int32.Parse बनाम Int32.TryParse के समान चर्चा है। पूर्व विफलता के मामले में एक अपवाद फेंकता है, बाद रिटर्न झूठी और कार्यक्रम सुचारू रूप से जारी है ...

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