खोज अगर मूल्य Linq का उपयोग कर वस्तुओं की एक सूची में मौजूद है


228

कहो मेरे पास एक वर्ग है Customerजिसके पास एक संपत्ति है FirstName। फिर मैंने ए List<Customer>

क्या LINQ का उपयोग यह पता लगाने के लिए किया जा सकता है कि सूची Firstname = 'John'में एक एकल कथन वाला ग्राहक है .. कैसे?

जवाबों:


459

LINQ एक विस्तार विधि को परिभाषित करता है जो इस सटीक समस्या को हल करने के लिए एकदम सही है:

using System.Linq;
...
    bool has = list.Any(cus => cus.FirstName == "John");

सुनिश्चित करें कि आप System.Core.dll का संदर्भ लें, यही वह जगह है जहाँ LINQ रहता है।


24
कोई भी अच्छा है, मुझे आश्चर्य है कि जब वे किसी का उपयोग करना चाहिए तो कितने डेवलपर्स काउंट का उपयोग करते हैं?
रिचर्ड जूल

12
आप एक मामला असंवेदनशील खोज भी कर सकते हैं: cus => cus.FirstName.Equals ("जॉन", StringComparison.CurrentCultureIgnoreCase)
jmservera

1
मुझे पता है कि यह एक पुराना सवाल है लेकिन हम एक्ज़िस्ट विधि का उपयोग क्यों नहीं कर रहे हैं? देखने के रूप में यह देखने के लिए बना है कि क्या चीजें मौजूद हैं।
ब्लैकनकाउन

6
क्योंकि सभी संग्रहों में एक्ज़िस्ट नहीं हैं, और यह एक लंबोदर अभिव्यक्ति नहीं लेता है, बल्कि वह वस्तु है जिसकी हम स्वयं तलाश कर रहे हैं।
ज़्वोलकोव

1
@zvolkov, कोई भी विचार क्यों मेरे पुनर्जीवन का सुझाव दे रहा है मैं बूल का उपयोग करता है = सूची। सभी (cus => cus.FirstName! = "जॉन"); क्या यह अधिक इष्टतम है?
गुल्लू

105

zvolkov का उत्तर यह पता लगाने के लिए एकदम सही है कि क्या ऐसा कोई ग्राहक है। यदि आपको बाद में ग्राहक का उपयोग करने की आवश्यकता है , तो आप कर सकते हैं:

Customer customer = list.FirstOrDefault(cus => cus.FirstName == "John");
if (customer != null)
{
    // Use customer
}

मुझे पता है कि यह वह नहीं है जो आप पूछ रहे थे, लेकिन मुझे लगा कि मैं एक फॉलो-ऑन प्रश्न को पहले से छोड़ दूंगा :) (बेशक, यह केवल पहले ऐसे ग्राहक को ढूंढता है ... उन सभी को खोजने के लिए, बस एक का उपयोग करें सामान्य whereखंड।)


7
मुझे लगता है कि आप बाद में जब यह डिबगिंग की बात आती है, तो आप की सराहना कर सकते हैं, अगर आप अपने आप को अचानक उत्सुक पाते हैं कि यह कौन सा ग्राहक था जो मानदंड फिट था।
mqp

1
बस इस उत्तर को एक कोस पर टकराना मुझे पसंद है जिस तरह से एसओ समुदाय प्रश्न / उत्तर के लिए और भी अधिक जोड़ने के लिए अतिरिक्त कदम उठाता है।
बार्नीमेक

1
धन्यवाद इससे मुझे मदद मिली, लेकिन कभी-कभी मैं केवल boolपरिणाम प्राप्त करना चाहता हूं , इसलिए उस स्थिति में .Anyया यहां.FindIndex उपयोग किया जाता है जो तेज है ?
शजीत

1
@stom: वे दोनों O (N) हैं, मूल रूप से ... वे केवल रेखीय खोज हैं।
जॉन स्कीट

इसे उछालना। मुझे यह पसंद है कि आप सूची के सिंटैक्स का उपयोग कैसे करते हैं। किसी सूची को करने के बजाय। FirstOrDefault।
गन वेंडर

25

प्रश्न पर अनुसरण के लिए एक विकल्प (एक ग्राहक को खोजने के लिए जिनके पास पहले नामों की संख्या हो सकती है):

List<string> names = new List<string>{ "John", "Max", "Pete" };
bool has = customers.Any(cus => names.Contains(cus.FirstName));

या इसी तरह की सूची के सीएसवी से ग्राहक को पुनः प्राप्त करने के लिए

string input = "John,Max,Pete";
List<string> names = input.Split(',').ToList();
customer = customers.FirstOrDefault(cus => names.Contains(cus.FirstName));

10

Linq का उपयोग करने की आपके पास कई संभावनाएँ हैं, यहाँ एक बिना लैम्बदास का उपयोग किए:

//assuming list is a List<Customer> or something queryable...
var hasJohn = (from customer in list
         where customer.FirstName == "John"
         select customer).Any();

5
customerList.Any(x=>x.Firstname == "John")

यह प्रश्न का उत्तर नहीं देता है "यदि" ऐसी प्रविष्टि मौजूद है; यदि वे मौजूद हैं तो यह केवल मूल्यों की गणना करता है। यह निर्धारित करने के लिए एक अतिरिक्त कदम की आवश्यकता है कि क्या यह संसेचन गैर-रिक्त है।
जसून

फिर व्हेयर टू वेट चेंज। मेरे लिए शायद अधिक दार्शनिक है। मुझे शायद ही यह जानने की जरूरत है कि बिना परवाह किए कि वे कौन से हैं। @jmservera: आप सही थे। मैंने कुछ समय पहले LINQ को छोड़ दिया था और अब विशेष रूप से Lambda का उपयोग करता हूं।
क्रिस ब्रांड्समा

जब मुझे लगता है कि लैम्बडा कॉल का उपयोग करना अभी भी तकनीकी रूप से LINQ का उपयोग कर रहा है, तो मुझे पांडित्य से मतलब नहीं है। (विशेष रूप से, आप LINQ-to-Objects का उपयोग कर रहे हैं।) आप भाषा कीवर्ड के बजाय केवल पद्धति कॉल का उपयोग कर रहे हैं।
जुदा गेब्रियल हिमंगो

यह उत्तर zvolkov's से कैसे भिन्न है?
dotnetN00b

4

खोज से पहले मैंने जिस तकनीक का इस्तेमाल किया था .Any():

var hasJohn = (from customer in list
      where customer.FirstName == "John"
      select customer).FirstOrDefault() != null;

3
List<Customer> list = ...;
Customer john = list.SingleOrDefault(customer => customer.Firstname == "John");

जॉन किसी भी ग्राहक को "जॉन" के पहले नाम के साथ मौजूद होने पर अशक्त होगा।


2
यदि एक से अधिक ग्राहक को जॉन कहा जाता है, तो वह एक अपवाद को फेंक देगा ।
जॉन स्कीट

1
टिप्पणी के लिए धन्यवाद। मैं आंशिक रूप से सही उदाहरण के रूप में उत्तर छोड़ दूंगा।
204 पर M4N

यह एक परिदृश्य में तब भी मान्य है जब आप सुनिश्चित हैं कि 1 है और आप एक से अधिक होने पर एक अपवाद उठाना चाहते हैं, इसलिए मुझे लगता है कि यह अच्छा है कि आपने इसे हटाया नहीं।
रिचर्ड जूल

1

एक अन्य संभावना

if (list.Count(customer => customer.Firstname == "John") > 0) {
 //bla
}

4
इस परिदृश्य में किसी का उपयोग करना बेहतर होगा।
रिचर्ड जूल

1

यह कोशिश करो, मुझे आशा है कि यह आपकी मदद करता है।

 if (lstCustumers.Any(cus => cus.Firstname == "John"))
 {
     //TODO CODE
 }

4
यह 8 साल पहले से स्वीकृत उत्तर के समान है। कृपया सुनिश्चित करें कि सभी उत्तरों में आपका उत्तर अद्वितीय है।
टोनी_ हेनरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.