कब उपयोग करें। पहले और कब उपयोग करना है।


824

मैंने आसपास खोज की है और वास्तव में एक स्पष्ट उत्तर नहीं मिला है कि आप कब उपयोग करना चाहते हैं .Firstऔर आप .FirstOrDefaultLINQ के साथ कब उपयोग करना चाहते हैं ।

  • आप कब उपयोग करना चाहेंगे .First? केवल तभी जब आप अपवाद को पकड़ना चाहते हैं यदि कोई परिणाम नहीं लौटा है?

    var result = List.Where(x => x == "foo").First();
  • और आप कब उपयोग करना चाहेंगे .FirstOrDefault? यदि आप हमेशा डिफ़ॉल्ट प्रकार चाहते हैं यदि कोई परिणाम नहीं है?

    var result = List.Where(x => x == "foo").FirstOrDefault();
  • और उस बात के लिए, टेक के बारे में क्या?

    var result = List.Where(x => x == "foo").Take(1);

86
.Firstऔर .FirstOrDefaultदोनों तर्क के रूप में भविष्यवाणी करते हैं, इसलिए var result = List.Where(x => x == "foo").First();इसे फिर से लिखा जा सकता हैvar result = List.First(x => x == "foo");
Rian Schmits

59
विचार करने के लिए मत भूलना Singleऔर SingleOrDefault। मुझे नफरत है जब लोग Firstवास्तव में मतलब होने पर उपयोग करते हैं Single; )
बार्टोज़केपी

19
एकल या SingleOrDefault एक अपवाद को फेंक देगा यदि एक से अधिक तत्व वापस आ गए हैं! मुझे लगता है कि सबसे आम मामलों में FirstOrDefault बेहतर है!
एरिक ड्रेवेन

21
बिंदु तब होता है जब आप एकल परिणाम की अपेक्षा करते हैं जो आपको ऐसा कहना चाहिए, और अपवाद आपके तर्क को विफल होने का संकेत देता है।
नेटमैज

1
यह भी विचार करें कि .FirstOrDefault()हमेशा उपयोग करने से आपको अधिक सार्थक अपवाद फेंकने का अवसर मिलता है। यदि एक अनुक्रम अपवाद को फेंक दिया जाता है और .First()एक विधि में एक से अधिक है , तो यह समझना मुश्किल हो सकता है कि कौन सा कथन समस्या है।
स्टिंगजैक 14

जवाबों:


807

First()जब मैं जानता हूं या कम से कम एक तत्व होने की उम्मीद करता हूं तो मैं इसका उपयोग करूंगा । दूसरे शब्दों में, जब यह एक असाधारण घटना है कि अनुक्रम खाली है।

उपयोग करें FirstOrDefault()जब आप जानते हैं कि आपको यह जांचने की आवश्यकता होगी कि क्या कोई तत्व था या नहीं। दूसरे शब्दों में, जब अनुक्रम खाली होना कानूनी है। आपको चेक के लिए अपवाद हैंडलिंग पर भरोसा नहीं करना चाहिए। (यह बुरा अभ्यास है और प्रदर्शन को नुकसान पहुंचा सकता है)।

अंत में, इसके बीच का अंतर है First()और Take(1)वह First()तत्व को स्वयं वापस करता है, जबकि Take(1)तत्वों का एक क्रम देता है जिसमें बिल्कुल एक तत्व होता है।


4
@driis - मुझे लगता है कि हम First और FirstOrDefault के बीच चयन करते समय असाधारण अपवाद दिशानिर्देश के मंत्र का उपयोग कर सकते हैं। स्पष्ट उत्तर के लिए धन्यवाद।
मेट्रो स्मर्फ

5
केवल एक चीज मैं यह जोड़ूंगा कि यदि आप जिस प्रकार का चयन कर रहे हैं उसके लिए डिफ़ॉल्ट मान एक वैध मान हो सकता है, उदाहरण के लिए आपका परिणाम अंतर मान 0 हो सकता है, तो अपवाद को संभालने के लिए इसे संभालना सबसे अच्छा तरीका लगता है ।
पीटरबेलम

25
स्क्रैच कि, मुझे पूरा करने का एक बहुत अच्छा तरीका मिल गया है, का उपयोग करें: DefaultIfEmpty (-1)
.First

5
टेक बिल्कुल एक तत्व नहीं लौटाता है, यह अधिकांश एक तत्व पर लौटता है (यदि आप 1 निर्दिष्ट करते हैं, तो निश्चित रूप से)। यह 0 तत्वों को वापस कर सकता है, यदि अनुक्रम शुरू में खाली है।
SPIRiT_1984

3
@RoyiNamir, उस प्रश्न के संदर्भ में हाँ जहां पैरामीटर 1 है। मैंने यह भी नोट किया कि इस वाक्य में तुरंत परेंस में।
ड्रीनिस

272

.Firstकोई परिणाम नहीं होने पर एक अपवाद फेंक देंगे। .FirstOrDefaultनहीं, यह बस या तो अशक्त (संदर्भ प्रकार) या मान प्रकार का डिफ़ॉल्ट मान लौटाएगा। (उदाहरण के 0लिए जैसे एक इंट।) यहां सवाल यह नहीं है कि आप डिफ़ॉल्ट प्रकार कब चाहते हैं, लेकिन अधिक: क्या आप अपवाद को संभालने या डिफ़ॉल्ट मान को संभालने के लिए तैयार हैं? जब से अपवाद असाधारण होना चाहिए, FirstOrDefaultतब पसंद किया जाता है जब आप सुनिश्चित न हों कि आप अपनी क्वेरी से परिणाम प्राप्त करने जा रहे हैं। जब तार्किक रूप से डेटा होना चाहिए, तो अपवाद हैंडलिंग पर विचार किया जा सकता है।

Skip()और Take()आमतौर पर परिणामों में पेजिंग सेट करते समय उपयोग किया जाता है। (जैसे पहले 10 परिणाम दिखा रहे हैं, और अगले पृष्ठ पर अगले 10, आदि)

उम्मीद है की यह मदद करेगा।


5
@Jeroen - स्किप / टेक का उपयोग करने के लिए बेहतर उपयोग मामलों पर अच्छा बिंदु।
मेट्रो स्मर्फ

4
+1 प्रकार के स्पष्टीकरण के लिए जो .FirstOrDefaultसंदर्भ प्रकारों के लिए अशक्त हो जाएगा। मैं इस बारे में उलझन में था कि एक "डिफ़ॉल्ट" वस्तु क्या होगी। इस उत्तर ने साफ़ कर दिया कि ऊपर।
माइक टैवर्न

115

.First()यदि कोई पंक्ति नहीं है तो एक अपवाद को फेंक देंगे, जबकि इसके बजाय .FirstOrDefault()डिफ़ॉल्ट मान ( NULLसभी संदर्भ प्रकारों के लिए) वापस आ जाएगा।

इसलिए यदि आप तैयार हैं और एक संभावित अपवाद को संभालने के लिए तैयार हैं, .First()तो ठीक है। यदि आप != nullकिसी भी तरह से रिटर्न वैल्यू की जांच करना पसंद करते हैं , तो .FirstOrDefault()यह आपका बेहतर विकल्प है।

लेकिन मुझे लगता है कि यह थोड़ी व्यक्तिगत पसंद है। जो भी आप के लिए और अधिक समझ में आता है और अपने कोडिंग शैली को बेहतर बनाता है का उपयोग करें।


66

प्रथम()

  1. किसी अनुक्रम का पहला तत्व देता है।
  2. परिणाम या स्रोत में कोई तत्व नहीं होने पर यह एक त्रुटि है।
  3. आपको इसका उपयोग करना चाहिए, यदि एक से अधिक तत्व अपेक्षित हैं और आप केवल पहला तत्व चाहते हैं।

FirstOrDefault ()

  1. अनुक्रम का पहला तत्व, या कोई तत्व नहीं मिलने पर एक डिफ़ॉल्ट मान देता है।
  2. यह केवल एक त्रुटि है, यदि स्रोत शून्य है।
  3. आपको इसका उपयोग करना चाहिए, यदि एक से अधिक तत्व अपेक्षित हैं और आप केवल पहला तत्व चाहते हैं। रिजल्ट खाली होने पर भी अच्छा रहेगा।

हमारे पास एक UserInfos तालिका है, जिसमें नीचे दिखाए गए अनुसार कुछ रिकॉर्ड हैं। इस तालिका के आधार पर नीचे मैंने उदाहरण दिया है ...

उपयोगकर्ता सूची

पहले () का उपयोग कैसे करें

var result = dc.UserInfos.First(x => x.ID == 1);

केवल एक रिकॉर्ड है जहां ID == 1. इस रिकॉर्ड को वापस करना चाहिए
आईडी: 1 पहला नाम: मनीष अंतिम नाम: दुबे ईमेल: xyz@xyz.com

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

ऐसे कई रिकॉर्ड हैं जहाँ FName == "राहुल" है। पहला रिकॉर्ड वापस होना चाहिए।
आईडी: 7 पहला नाम: राहुल अंतिम नाम: शर्मा ईमेल: xyz1@xyz.com

var result = dc.UserInfos.First(x => x.ID ==13);

ID == 13. के साथ कोई रिकॉर्ड नहीं है। एक त्रुटि होनी चाहिए।
InvalidOperationException: अनुक्रम में कोई तत्व नहीं हैं

FirstOrDefault () का उपयोग कैसे करें

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

केवल एक रिकॉर्ड है जहां ID == 1. इस रिकॉर्ड को वापस करना चाहिए
आईडी: 1 पहला नाम: मनीष अंतिम नाम: दुबे ईमेल: xyz@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

ऐसे कई रिकॉर्ड हैं जहाँ FName == "राहुल" है। पहला रिकॉर्ड वापस होना चाहिए।
आईडी: 7 पहला नाम: राहुल अंतिम नाम: शर्मा ईमेल: xyz1@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

आईडी == 13. के साथ कोई रिकॉर्ड नहीं है। वापसी मूल्य शून्य है

आशा है कि यह आपको समझने में मदद करेगा कि कब उपयोग करना है First()या नहीं FirstOrDefault()


4
मेरी राय में, "एक त्रुटि होनी चाहिए।" तीसरे FirstOrDefault () के तहत - उदाहरण भ्रामक है।
जनक

नमस्कार, आप अच्छी तरह से समझाते हैं, लेकिन मैं थोड़ा उलझन में हूं कि कब जुड़ने से डेटा मिलेगा और जब आईडी उस समय एक विदेशी कुंजी तालिका में मौजूद नहीं थी, जिसका उपयोग किया जाता है? वर्तमान में, मैं First () का उपयोग कर रहा हूं, लेकिन आपके उत्तर को पढ़ने के बाद मुझे कुछ पता नहीं है। कृपया मदद करें
बृजेश मवानी

20

सबसे पहले, Takeएक पूरी तरह से अलग विधि है। यह एक लौटाता है IEnumerable<T>और एक भी नहीं T, इसलिए यह बाहर है।

बीच Firstऔर FirstOrDefault, आप का उपयोग करना चाहिए Firstजब आप सुनिश्चित करें कि एक तत्व मौजूद है और अगर ऐसा नहीं होता है, तो उसमें कोई त्रुटि है कर रहे हैं।

वैसे, यदि आपके अनुक्रम में default(T)तत्व (जैसे null) हैं और आपको खाली और पहला तत्व होने के बीच अंतर करने की आवश्यकता है null, तो आप उपयोग नहीं कर सकते FirstOrDefault


2
@ मेहरदाद - महान बिंदु, फिर से:। पहला रिटर्न IEnumerable और जब FirstOrDefault का उपयोग नहीं करना है।
मेट्रो स्मर्फ

15

प्रथम:

  • किसी अनुक्रम का पहला तत्व देता है
  • अपवाद फेंकता है: परिणाम में कोई तत्व नहीं हैं
  • कब का उपयोग करें: जब 1 से अधिक तत्व अपेक्षित हो और आप केवल पहला ही चाहते हैं

FirstOrDefault:

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

से: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/


10

ध्यान देने के लिए एक और अंतर यह है कि यदि आप किसी ऐसे उत्पादन परिवेश में किसी एप्लिकेशन को डीबग कर रहे हैं, जिसके लिए आपके पास पंक्ति संख्या तक पहुंच नहीं हो सकती है, तो इस बात को पहचानना कि किस .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));
}

5

प्रथम()

जब आप जानते हैं कि परिणाम में 1 से अधिक तत्व अपेक्षित हैं और आपको केवल अनुक्रम का पहला तत्व होना चाहिए।

FirstOrDefault ()

FirstOrDefault () केवल First () को छोड़कर है, यदि कोई तत्व निर्दिष्ट स्थिति से मेल नहीं खाता है तो यह अंतर्निहित प्रकार के सामान्य संग्रह का डिफ़ॉल्ट मान लौटाता है। यदि कोई तत्व नहीं मिला तो यह InvalidOperationException को नहीं फेंकता है। लेकिन तत्व या अनुक्रम का संग्रह शून्य है क्योंकि यह एक अपवाद फेंकता है।


नमस्कार, आप अच्छी तरह से समझाते हैं, लेकिन मैं थोड़ा उलझन में हूं कि कब जुड़ने से डेटा मिलेगा और जब आईडी उस समय एक विदेशी कुंजी तालिका में मौजूद नहीं थी, जिसका उपयोग किया जाता है? वर्तमान में, मैं First () का उपयोग कर रहा हूं, लेकिन आपके उत्तर को पढ़ने के बाद मुझे कुछ पता नहीं है। कृपया मदद करें
बृजेश मवानी

4

इस प्रकार का फ़ंक्शन तत्व ऑपरेटरों के अंतर्गत आता है। कुछ उपयोगी तत्व ऑपरेटरों को नीचे परिभाषित किया गया है।

  1. प्रथम / FirstOrDefault
  2. अंतिम / LastOrDefault
  3. सिंगल / SingleOrDefault

जब हम किसी निश्चित स्थिति के आधार पर अनुक्रम से किसी एक तत्व का चयन करने की आवश्यकता होती है, तो हम तत्व ऑपरेटरों का उपयोग करते हैं। यहाँ एक उदाहरण है।

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };

पहले () ऑपरेटर हालत को संतुष्ट करने के बाद एक अनुक्रम का पहला तत्व लौटाता है। यदि कोई तत्व नहीं पाया गया तो वह एक अपवाद फेंक देगा।

int result = items.here (आइटम => आइटम == 2) .first ();

FirstOrDefault () ऑपरेटर शर्त को पूरा करने के बाद किसी अनुक्रम का पहला तत्व लौटाता है। यदि कोई तत्व नहीं मिला है, तो यह उस प्रकार का डिफ़ॉल्ट मान लौटाएगा।

int result1 = items.Where (आइटम => आइटम == 2)। .FirstOrDefault ();


उदाहरण को समझने में आसान के साथ अच्छी तरह से समझाया गया है।
अर्सलान भट्टी

3

मुझे एक वेबसाइट मिली, जिसमें फर्स्टऑर्डडेफ़ॉल्ट
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/ की आवश्यकता के बारे में समझाने के लिए apperars
यदि कोई क्वेरी करने के लिए कोई परिणाम नहीं है, और आप पहले कॉल करना चाहते हैं () या एकल () एकल पंक्ति प्राप्त करने के लिए ... आपको एक "अनुक्रम में कोई तत्व नहीं है" अपवाद मिलेगा।

डिस्क्लेमर: मैंने कभी LINQ का इस्तेमाल नहीं किया है, इसलिए अगर यह निशान से दूर है तो मेरी माफी।


2
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

कौन सा उपयोग करना है? यह व्यापारिक तर्क द्वारा तय किया जाना चाहिए, न कि अपवाद / प्रोग्राम विफलता के डर से।

उदाहरण के लिए, यदि व्यावसायिक तर्क यह कहता है कि हम किसी भी कार्य दिवस पर शून्य लेनदेन नहीं कर सकते हैं (बस मान लें)। फिर आपको कुछ स्मार्ट प्रोग्रामिंग के साथ इस परिदृश्य को संभालने की कोशिश नहीं करनी चाहिए। मैं हमेशा इस तरह के संग्रह से पहले () का उपयोग करूंगा, और कार्यक्रम को विफल कर दूंगा अगर कुछ और व्यापार तर्क को खराब कर दे।

कोड:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

मैं इस पर दूसरों की टिप्पणियों को देखना चाहूंगा।


संदर्भ और अशक्त प्रकारों के लिए डिफ़ॉल्ट मान शून्य है।
dsa

जल्दी से असफल होना अच्छा है - हालांकि आपके द्वारा वर्णित परिदृश्य के लिए, मैं पहले देखना चाहता हूं, क्या यह विफल रहा है, अपवाद को पकड़ें, और फिर एक सार्थक त्रुटि लौटाएं। जैसे पकड़ (InvalidOperationException e) {फेंकना नया InvalidOperationException ("एक दिन में शून्य नहीं हो सकता!", E)}; लेकिन हाँ, एक वास्तविक व्यापार तर्क समस्या से निपटने के लिए डिफ़ॉल्ट का उपयोग करना बहुत बुरा है।
मैथिसन

1

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

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));

बिल्कुल नहीं। पहले निर्माणकर्ता का व्यापक रूप से उपयोग किया जाता है जब आपको केवल एक आइटम को पुनः प्राप्त करने की आवश्यकता होती है या परिणाम को असाइन करते समय एक संकलन त्रुटि से बचना पड़ता है जो कि एक सरणी नहीं है और आपको यकीन है कि क्वेरी बिल्कुल एक परिणाम देता है। हालांकि यह एक अतिरिक्त का उपयोग करने के बजाय दूसरे कंस्ट्रक्टर का उपयोग करने के लिए तेजी से लग सकता है। कहीं भी () (क्योंकि आपको लगता है कि LINQ पहले खोजने के बाद सूची में वस्तुओं का मूल्यांकन करना बंद कर देता है) यह हमेशा पहले तत्व पर रुकता है
usr-local-

0

दूसरों ने बहुत अच्छी तरह से First()और के बीच के अंतर का वर्णन किया है FirstOrDefault()। मैं इन तरीकों के शब्दार्थ की व्याख्या करने के लिए एक और कदम उठाना चाहता हूं। मेरी राय FirstOrDefaultमें बहुत अधिक इस्तेमाल किया जा रहा है। अधिकांश मामलों में जब आप डेटा को फ़िल्टर कर रहे होते हैं, तो आप या तो अपने अद्वितीय पहचानकर्ता द्वारा तार्किक स्थिति या एकल अद्वितीय तत्व से मेल खाते तत्वों का एक संग्रह प्राप्त करने की अपेक्षा करेंगे - जैसे कि उपयोगकर्ता, पुस्तक, पोस्ट आदि ... क्यों कि हम यह भी कह सकते हैं कि FirstOrDefault()एक कोड गंध है क्योंकि ऐसा नहीं है कि इसमें कुछ गड़बड़ है लेकिन क्योंकि इसका उपयोग अक्सर किया जा रहा है। यह ब्लॉग पोस्ट विवरण में विषय की पड़ताल करता है। ज्यादातर बार आईएमओSingleOrDefault() एक बेहतर विकल्प है इसलिए इस गलती को देखें और सुनिश्चित करें कि आप सबसे उपयुक्त विधि का उपयोग करें जो आपके अनुबंध और अपेक्षाओं का स्पष्ट रूप से प्रतिनिधित्व करती है।


-6

linq कई सरल तरीकों को संग्रह पर लागू करने के लिए, बस हम sql में जॉइन करते हैं, एक फिल्टर को पहले या आखिरी में जरूरत और आवश्यकता के आधार पर लागू किया जा सकता है।

यहां एक उदाहरण है जहां हम एक संग्रह में एक आईडी के साथ एक तत्व पा सकते हैं। इस पर और अधिक जोड़ने के लिए, पहले तरीके, FirstOrDefaultएक संग्रह में कम से कम एक रिकॉर्ड होने पर आदर्श रूप से वही वापस आ जाएगा। यदि, हालांकि, एक संग्रह खाली होना ठीक है। फिर Firstएक अपवाद लौटाएगा लेकिन FirstOrDefaultवापस आएगा nullया डिफ़ॉल्ट होगा। उदाहरण के लिए, int0. वापस आ जाएगा। इस प्रकार का उपयोग हालांकि व्यक्तिगत प्राथमिकता के रूप में कहा जाता है, लेकिन FirstOrDefaultअपवाद से बचने के लिए इसका उपयोग बेहतर है । यहाँ एक उदाहरण है जहाँ, हम लेनदेन सूची के संग्रह पर चलते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.