c# - कब उपयोग करें। सबसे पहले और कब उपयोग करें। LINQ के साथirstOrDefault?
.net (10)
इस प्रकार का फ़ंक्शन तत्व ऑपरेटरों से संबंधित है। कुछ उपयोगी तत्व ऑपरेटर नीचे परिभाषित किए गए हैं।
- प्रथम / FirstOrDefault
- अंतिम / LastOrDefault
- सिंगल / SingleOrDefault
हम तत्व ऑपरेटर का उपयोग करते हैं जब हमें किसी निश्चित स्थिति के आधार पर अनुक्रम से एकल तत्व चुनने की आवश्यकता होती है। उदाहरण यहाँ है।
List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9,2,10};
पहले () ऑपरेटर शर्त को संतुष्ट करने के बाद अनुक्रम का पहला तत्व देता है। यदि कोई तत्व नहीं मिला है तो यह अपवाद के माध्यम से होगा।
int परिणाम = आइटम। जहां (आइटम => आइटम == 2)। सबसे पहले ();
FirstOrDefault () ऑपरेटर शर्त को संतुष्ट करने के बाद अनुक्रम का पहला तत्व देता है। यदि कोई तत्व नहीं मिला है तो यह उस प्रकार के डिफ़ॉल्ट मान को वापस कर देगा।
int परिणाम 1 = आइटम। जहां (आइटम => आइटम == 2) .FirstOrDefault ();
मैंने चारों ओर खोज की है और वास्तव में एक स्पष्ट उत्तर नहीं मिला है कि आप कब उपयोग करना चाहते हैं .First
और जब आप उपयोग करना चाहते हैं। LINQ के साथ .FirstOrDefault
।
आप कब उपयोग करना चाहेंगे
.First
? केवल तभी जब आप अपवाद को पकड़ना चाहते हैं तो कोई परिणाम नहीं लौटाया गया है?var result = List.Where(x => x == "foo").First();
और आप कब उपयोग करना
.FirstOrDefault
।.FirstOrDefault
? कोई परिणाम न होने पर आप हमेशा डिफ़ॉल्ट प्रकार चाहते हैं?var result = List.Where(x => x == "foo").FirstOrDefault();
और उस मामले के लिए, टेक के बारे में क्या?
var result = List.Where(x => x == "foo").Take(1);
कोई परिणाम नहीं होने पर .First
अपवाद फेंक देगा। .FirstOrDefault
नहीं होगा, यह केवल शून्य (संदर्भ प्रकार) या मूल्य प्रकार के डिफ़ॉल्ट मान को वापस कर देगा। (उदाहरण के लिए एक int के लिए 0
तरह।) यहां सवाल यह नहीं है कि आप डिफ़ॉल्ट प्रकार चाहते हैं, लेकिन अधिक: क्या आप अपवाद को संभालने या डिफ़ॉल्ट मान को संभालने के इच्छुक हैं? चूंकि अपवाद असाधारण होना चाहिए, इसलिए जब आप सुनिश्चित नहीं हैं कि आप अपनी क्वेरी से परिणाम प्राप्त करने जा रहे हैं तो FirstOrDefault
को प्राथमिकता दी जाती है। जब तार्किक रूप से डेटा होना चाहिए, अपवाद हैंडलिंग पर विचार किया जा सकता है।
Skip()
और Take()
आमतौर पर परिणामों में पेजिंग सेट करते समय उपयोग किया जाता है। (पहले 10 परिणामों को दिखाने की तरह, और अगले पृष्ठ पर अगले 10, आदि)
उम्मीद है की यह मदद करेगा।
ध्यान देने योग्य एक और अंतर यह है कि यदि आप उत्पादन वातावरण में किसी एप्लिकेशन को डिबग कर रहे हैं तो आपके पास लाइन नंबर तक पहुंच नहीं हो सकती है, इसलिए विशेष रूप से पहचानना .First()
किसी विधि में .First()
कथन ने अपवाद को मुश्किल बना दिया है।
अपवाद संदेश में आपके द्वारा उपयोग किए जाने वाले किसी भी लैम्ब्डा अभिव्यक्तियों में भी शामिल नहीं होगा जो किसी भी समस्या को डीबग करने के लिए कठिन होगा।
यही कारण है कि मैं हमेशा FirstOrDefault()
उपयोग करता हूं, भले ही मुझे पता है कि एक शून्य प्रविष्टि एक असाधारण स्थिति का गठन करेगी।
var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
पुरानी पोस्ट का जवाब पोस्ट करने के लिए खेद है। विस्तार और अच्छी व्याख्या इसलिए कृपया नीचे यूआरएल पढ़ें http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
मुझे एक वेबसाइट मिली जो FirstOrDefault की आवश्यकता को समझाने के लिए उपयुक्त है
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
यदि कोई प्रश्न नहीं है, और आप एक पंक्ति प्राप्त करने के लिए पहले () या सिंगल () को कॉल करना चाहते हैं ... आपको "अनुक्रम में कोई तत्व नहीं है" अपवाद प्राप्त होगा।
अस्वीकरण: मैंने LINQ का कभी भी उपयोग नहीं किया है, इसलिए माफी माँगती है अगर यह निशान से बाहर है।
मैं First()
उपयोग करता हूं जब मैं अनुक्रम को कम से कम एक तत्व के बारे में जानता हूं या उम्मीद करता हूं। दूसरे शब्दों में, जब यह एक असाधारण घटना है कि अनुक्रम खाली है।
FirstOrDefault()
उपयोग करें जब आप जानते हैं कि आपको यह जांचने की आवश्यकता होगी कि कोई तत्व था या नहीं। दूसरे शब्दों में, जब अनुक्रम खाली होने के लिए कानूनी है। आपको चेक के लिए अपवाद हैंडलिंग पर भरोसा नहीं करना चाहिए। (यह खराब अभ्यास है और प्रदर्शन को चोट पहुंचा सकता है)।
अंत में, First()
और Take()
बीच का अंतर यह है कि First()
तत्व स्वयं को लौटाता है, जबकि Take()
तत्वों का अनुक्रम देता है जिसमें बिल्कुल एक तत्व होता है। (यदि आप पैरामीटर के रूप में 1 पास करते हैं)।
सबसे पहले () वापस आने के लिए कोई पंक्ति नहीं होने पर अपवाद फेंक देगा, जबकि .FirstOrDefault () डिफ़ॉल्ट मान (सभी संदर्भ प्रकारों के लिए NULL
) बदलेगा।
तो यदि आप एक संभावित अपवाद को संभालने के लिए तैयार और तैयार हैं, तो .First()
ठीक है। यदि आप वैसे भी वापसी मूल्य की जांच करना पसंद करते हैं, तो फिर भी .FirstOrDefault()
आपकी बेहतर पसंद है।
लेकिन मुझे लगता है कि यह भी एक व्यक्तिगत वरीयता है। जो भी आपको अधिक समझ में आता है और अपनी कोडिंग शैली को बेहतर तरीके से फिट करें।
सबसे पहले, Take
एक पूरी तरह से अलग विधि है। यह एक IEnumerable<T>
और एक T
नहीं देता है, तो यह बाहर है।
First
और FirstOrDefault
बीच, आपको First
उपयोग करना चाहिए जब आप सुनिश्चित हों कि कोई तत्व मौजूद है और यदि ऐसा नहीं होता है, तो कोई त्रुटि है।
वैसे, यदि आपके अनुक्रम में default(T)
तत्व (जैसे null
) शामिल हैं और आपको खाली होने और पहले तत्व को null
बीच अंतर करने की आवश्यकता है, तो आप FirstOrDefault
उपयोग नहीं कर सकते हैं।
प्रथम()
जब आप जानते हैं कि परिणाम में 1 से अधिक तत्व अपेक्षित हैं और आपको केवल अनुक्रम का पहला तत्व होना चाहिए।
FirstOrDefault ()
FirstOrDefault () पहले () को छोड़कर है, सिवाय इसके कि, यदि कोई तत्व निर्दिष्ट स्थिति से मेल नहीं खाता है, तो यह सामान्य संग्रह के अंतर्निहित प्रकार के डिफ़ॉल्ट मान को लौटाता है। यदि कोई तत्व नहीं मिला तो यह अवैधऑपरेशन अपवाद नहीं फेंकता है। लेकिन तत्व या अनुक्रम का संग्रह अपवाद फेंकने से शून्य है।
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)
किस का उपयोग करना है? यह व्यापार तर्क द्वारा तय किया जाना चाहिए, और अपवाद / प्रोग्राम विफलता का डर नहीं।
उदाहरण के लिए, यदि व्यवसाय तर्क कहता है कि हमारे पास किसी भी कार्य दिवस (बस मान लें) पर शून्य लेनदेन नहीं हो सकता है। तो आपको कुछ स्मार्ट प्रोग्रामिंग के साथ इस परिदृश्य को संभालने की कोशिश नहीं करनी चाहिए। मैं हमेशा इस तरह के संग्रह पर पहले () का उपयोग करता हूं, और यदि प्रोग्राम ने व्यवसाय तर्क को खराब कर दिया तो प्रोग्राम विफल हो जाए।
कोड:
var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()
मैं इस पर अन्य टिप्पणियां देखना चाहता हूं।