सवाल एक आइटम का चयन करने के लिए लिंक कोड


मैं खुद को मेल खाने वाले एक आइटम का चयन करने के लिए इस तरह के बहुत सारे कोड लिखता हूं

var item = (from x in Items where x.Id == 123 select x).First();

क्या ऐसा करने का कोई क्लीनर तरीका है या यह संक्षिप्त है जैसा कि मैं प्राप्त करने जा रहा हूं?

संपादित करें: "linq वाक्यविन्यास का उपयोग कर क्लीनर तरीका" कहा जाना चाहिए था। मैं पहले से ही लैम्ब्डा सिंटैक्स से अवगत था और ऐसा लगता है कि यह वास्तव में एकमात्र तरीका है। हालांकि मुझे कुछ उपयोगी जानकारी मिली, इसलिए उत्तर देने वाले सभी लोगों के लिए धन्यवाद।


82
2017-10-18 15:26


मूल


व्यक्तिगत रूप से मैं बचता हूं Single() तथा SingleOrDefault() अगर मुझे पता है कि डेटा पहले से ही अद्वितीय है (उदाहरण के लिए उस डेटाबेस से जिसमें उस बाधा है, आदि), तब से Single() संभावित डुप्लिकेट खोजने के लिए बाकी सूची को स्कैन करने के लिए मजबूर करता है, लेकिन यह मैं हूं। यदि आपको इस बिंदु पर अपनी विशिष्टता को लागू करने की आवश्यकता है, तो उपयोग करें Single() परिवार, यदि नहीं, तो उपयोग करें First() परिवार। - James Michael Hare


जवाब:


निर्भर करता है कि आप linq क्वेरी सिंटैक्स को कितना पसंद करते हैं, आप सीधे विस्तार विधियों का उपयोग कर सकते हैं:

var item = Items.First(i => i.Id == 123);

और यदि सूची खाली है तो आप एक त्रुटि फेंकना नहीं चाहते हैं, तो उपयोग करें FirstOrDefault जो तत्व प्रकार के लिए डिफ़ॉल्ट मान देता है (null संदर्भ प्रकार के लिए):

var item = Items.FirstOrDefault(i => i.Id == 123);

if (item != null)
{
    // found it
}

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

का First() तथा Single() परिवार, यहां वे कहां फेंकते हैं:

  • First() - खाली / नहीं मिला फेंकता है, डुप्लिकेट अगर फेंक नहीं है
  • FirstOrDefault() - यदि खाली / नहीं मिला तो डिफ़ॉल्ट लौटाता है, डुप्लिकेट अगर फेंक नहीं देता है
  • Single() - यदि खाली / नहीं मिला तो फेंकता है, डुप्लिकेट मौजूद होने पर फेंकता है
  • SingleOrDefault() - यदि रिक्त / नहीं मिला तो डिफ़ॉल्ट लौटाता है, डुप्लिकेट मौजूद होने पर फेंकता है

138
2017-10-18 15:28



मुझे लगता है कि आप वहां दो बराबर संकेत खो रहे हैं। होना चाहिए i.Id == 123 - davehale23


FirstOrDefault या SingleOrDefault आपके परिदृश्य के आधार पर उपयोगी हो सकता है, और चाहे आप शून्य या एक से अधिक मैचों में हैंडल करना चाहते हैं:

FirstOrDefault: यदि कोई तत्व नहीं मिलता है तो अनुक्रम का पहला तत्व या डिफ़ॉल्ट मान देता है।

सिंगलऑर्डफॉल्ट: अनुक्रम का एकमात्र तत्व, या डिफ़ॉल्ट देता है   अगर अनुक्रम खाली है तो मूल्य; यदि यह विधि अपवाद फेंकता है तो   अनुक्रम में एक से अधिक तत्व हैं

मुझे नहीं पता कि यह लिनक 'से' क्वेरी में कैसे काम करता है लेकिन लैम्ब्डा सिंटैक्स में ऐसा लगता है:

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);

13
2017-10-18 15:27



डीबी समय पर कौन सा सबसे कुशल है? अगर मेरे पास वर्चर था तो मैं एक सटीक मैच चाहता था लेकिन संभव है कि कोई भी नहीं हो सकता? - ppumkin
स्वीकार्य उत्तर इसे पूरी तरह से संबोधित करता है, लेकिन अनिवार्य रूप से फर्स्टऑर्डडिफॉल्ट एक मैच मिलने के तुरंत बाद बंद हो जाता है, लेकिन सिंगलऑर्डफॉल्ट को यह सुनिश्चित करने के लिए पूरी सूची की जांच करनी चाहिए बिल्कुल एक मैच। - stuartd


ये पसंदीदा तरीके हैं:

var item = Items.SingleOrDefault(x => x.Id == 123);

या

var item = Items.Single(x => x.Id == 123);

9
2017-10-18 15:27



धन्यवाद - इसलिए इस स्थिति में कोई लिनक्स नोटेशन नहीं है और मुझे लैम्ब्स का उपयोग करने की ज़रूरत है? - Mikey Hogarth
वह बहुत बढिया है। मैंने वास्तव में linq का बहुत उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि मैं इन तरीकों से भी अवगत था। - wageoghe
एकल विधि जांच करता है कि वापसी मूल्य अद्वितीय है। तो यदि आपका संग्रह बड़ा है तो इसमें कई बार लग सकते हैं। पहली विधि केवल पहला तत्व देता है जो भविष्यवाणी से मेल खाता है। - meziantou
@ वागेघे जेम्स का जवाब linq का उपयोग नहीं करता है - सिंगल और सिंगलऑर्डफॉल्ट विधियां आईनेमेरेबल कार्यान्वयन का हिस्सा हैं। - Mikey Hogarth


इससे बेहतर हो सकता है।

var item = Items.First(x => x.Id == 123);

आपकी क्वेरी वर्तमान में गणना के भीतर सभी परिणामों को एकत्रित कर रही है (और एक से अधिक हो सकती है) और फिर पहले से लेना उस सेट, आवश्यक से अधिक काम कर रहे हैं।

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


6
2017-10-18 15:36





किसी के जीवन को आसान बनाने के लिए, लैम्ब्डा अभिव्यक्ति के साथ linq क्वेरी

(from x in Items where x.Id == 123 select x).FirstOrDefault();

परिणामस्वरूप एक एसक्यूएल क्वेरी है select top (1) इस में।


5
2017-11-07 14:11





आप विस्तार विधि वाक्यविन्यास का उपयोग कर सकते हैं:

var item = Items.Select(x => x.Id == 123).FirstOrDefault();

इसके अलावा, मुझे यकीन नहीं है कि आप अपने स्वयं के विशेष "प्रथम" और "फर्स्टऑर्डडिफॉल्ट" एक्सटेंशन विधियों को लिखने के बिना कितना अधिक संक्षिप्त हो सकते हैं।


3
2017-10-18 15:29





मैं आपको बताउंगा कि मेरे लिए क्या काम करता है:

int id = int.Parse(insertItem.OwnerTableView.DataKeyValues[insertItem.ItemIndex]["id_usuario"].ToString());

var query = user.First(x => x.id_usuario == id);
tbUsername.Text = query.username;
tbEmail.Text = query.email;
tbPassword.Text = query.password;

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


0
2017-09-13 14:11