2009-04-09 25 views
19

LINQ का उपयोग करना यदि सूची में आइटम मौजूद नहीं है तो सूची से एक आइटम का चयन करने का सबसे अच्छा तरीका क्या है?सूची से एकल आइटम का चयन करें

मैं दो समाधानों के साथ आया हूं, जिनमें से कोई भी मुझे पसंद नहीं है। मैं वस्तुओं की सूची का चयन करने के लिए एक खंड का उपयोग करता हूं (जो मुझे पता है केवल एक ही होगा), तो मैं गिनती की जांच कर सकता हूं और यदि गिनती एक है तो इस सूची पर एकल कॉल कर सकते हैं, दूसरी पसंद एक foreach का उपयोग करना है और बस आइटम प्राप्त करने के बाद तोड़ो।

इनमें से कोई भी एक अच्छा दृष्टिकोण की तरह प्रतीत नहीं होता है, क्या कोई बेहतर तरीका है?

उत्तर

32

आप IEnumerable.First() या IEnumerable.FirstOrDefault() का उपयोग कर सकते हैं।

अंतर यह है कि First() फेंक देगा यदि कोई तत्व नहीं मिला है (या यदि आप शर्तों का उपयोग करते हैं तो कोई तत्व शर्तों से मेल नहीं खाता है)। FirstOrDefault()default(T) (null वापस लौटाएगा यदि यह संदर्भ प्रकार है)।

+1

इतना आसान, यह सुनिश्चित नहीं है कि मैं इसे कैसे चूक गया। धन्यवाद। – Daniel

+0

यह वास्तव में भ्रमित होता है, जब हमारे पास आइटम की एक सूची होती है और हम एक शर्त (जहां()) के आधार पर एक आइटम चाहते हैं, विधि का नाम पहला/फर्स्टऑर्डडिफॉल्ट है, दस्तावेज ने कहा - अनुक्रम का पहला तत्व या डिफ़ॉल्ट मूल्य अगर अनुक्रम में कोई तत्व नहीं है। दिमाग में क्या बात यह है कि, इस विधि को सूची के माध्यम से बिना किसी सूची के पहले आइटम मिलेगा। [ref] (https://msdn.microsoft.com/en-us/library/bb340482 (v = vs.110) .aspx) –

+0

@ कुगनकुमार इसे तब तक पुनरावृत्त करना होगा जब तक कि यह कोई मिलान न मिले (या अंत को हिट करता है और करता है एक नहीं मिला) - यह "पहला मिलान तत्व" है, न कि "संग्रह का पहला तत्व" –

1

शायद मुझे यहां कुछ याद आ रही है, लेकिन आमतौर पर .SingleOrDefault() पर कॉल करने का तरीका सूची में एकल तत्व या डिफ़ॉल्ट मान (संदर्भ या शून्य प्रकार के लिए शून्य) वापस करने का तरीका है, यह सूची खाली है। यदि सूची में एक से अधिक तत्व होते हैं तो यह अपवाद उत्पन्न करता है।

उपयोग FirstOrDefault() मामले की देखभाल जहां आप एक से अधिक)

8
List<string> items = new List<string>(); 

items.Find(p => p == "blah"); 

या

items.Find(p => p.Contains("b")); 

हो सकता था, लेकिन यह आप को परिभाषित करने के लिए आप क्या एक मैच विधेय के माध्यम से देख रहे अनुमति देता है लेने के लिए ...

मुझे लगता है कि यदि आप linqToSql से बात कर रहे हैं तो:

उदाहरण खाता की तलाश में ...

DataContext dc = new DataContext(); 

Account item = dc.Accounts.FirstOrDefault(p => p.id == 5); 

क्या आप वाकई केवल 1 आइटम है कि वहाँ बनाने के लिए की जरूरत है (अपवाद फेंकता है जब एक से अधिक 1)

DataContext dc = new DataContext(); 

Account item = dc.Accounts.SingleOrDefault(p => p.id == 5); 
2

दो आसान तरीके हैं, पर निर्भर करता है यदि आप अपवादों से निपटना चाहते हैं या डिफ़ॉल्ट मान प्राप्त करना चाहते हैं।

आप पहले परिणाम या default(T) प्राप्त करने के लिए First<T>() या FirstOrDefault<T>() एक्सटेंशन विधि का उपयोग कर सकते हैं।

var list = new List<int> { 1, 2, 4 }; 
var result = list.Where(i => i == 3).First(); // throws InvalidOperationException 
var result = list.Where(i => i == 3).FirstOrDefault(); // = 0 
14

फर्स्टऑर्डफॉल्ट चयनकर्ता का उपयोग करें।

var list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 

var firstEven = list.FirstOrDefault(n => n % 2 == 0); 

if (firstEven == 0) 
    Console.WriteLine("no even number"); 
else 
    Console.WriteLine("first even number is {0}", firstEven); 

बस First या FirstOrDefault विधि करने के लिए एक विधेय में गुजरती हैं और यह खुशी दौर 'की सूची में जाने के लिए और आप के लिए पहला मैच उठाता हूँ।

यदि कोई मैच नहीं है, तो FirstOrDefault सूची आइटम जो भी डेटाटाइप का डिफ़ॉल्ट मान लौटाएगा।

आशा इस मदद करता है :-)

0

SingleOrDefault() आप क्या

चियर्स

4

बस जवाब पूरा करने की जरूरत है, तो आप LINQ वाक्य रचना का उपयोग कर रहे हैं, तो आप बस इसे बाद से यह रिटर्न लपेट कर सकते हैं एक IEnumerable:

(from int x in intList 
where x > 5 
select x * 2).FirstOrDefault() 
0

अभी इसे देखा है, अगर आप वस्तु की सूची के साथ काम कर रहे हैं तो आप इस

०१२३५१६४१०६१ कोशिश कर सकते हैं
public class user 
{ 
    public string username { get; set; } 
    public string password { get; set; } 
} 

    List<user> userlist = new List<user>(); 

     userlist.Add(new user { username = "macbruno", password = "1234" }); 
     userlist.Add(new user { username = "james", password = "5678" }); 
     string myusername = "james"; 
     string mypassword = "23432"; 

    user theUser = userlist.Find(
      delegate (user thisuser) 
      { 
       return thisuser.username== myusername && thisuser.password == mypassword; 
      } 
      ); 

      if (theUser != null) 
      { 
       Dosomething(); 
      } 
      else 
      { 
       DoSomethingElse(); 

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