2010-06-03 5 views
16

मैं लिखने के लिए करना चाहते हैं:IEnumerable <T> .Find बनाएँ()

IEnumerable<Car> cars; 
cars.Find(car => car.Color == "Blue") 

मैं विस्तार तरीकों के साथ यह पूरा कर सकते हैं? निम्नलिखित विफल रहता है क्योंकि यह IList को कॉल करने के बजाए खुद को कॉल करता है। ढूँढें()।

public static T Find<T>(this IEnumerable<T> list, Predicate<PermitSummary> match) 
{ 
    return list.ToList().Find(match); 
} 

धन्यवाद!

उत्तर

46

यह विधि पहले से मौजूद है। यह FirstOrDefault

cars.FirstOrDefault(car => car.Color == "Blue"); 

कहा जाता है कि आप इसे अपने आप को लागू करने के लिए थे, तो यह इस

public static T Find<T>(this IEnumerable<T> enumerable, Func<T,bool> predicate) { 
    foreach (var current in enumerable) { 
    if (predicate(current)) { 
     return current; 
    } 
    } 
    return default(T); 
} 
+0

धन्यवाद। इस अधिभार का अस्तित्व नहीं था। –

+0

महान उत्तर! मैंने कभी यह महसूस नहीं किया कि यह अधिभार अस्तित्व में है और अनावश्यक जोड़ रहा है। जहां (...)। पहला() कथन। – jhappoldt

3

तुम्हें पता है कि Find(...) द्वारा Where/First

IEnumerable<Car> cars; 
var result = cars.Where(c => c.Color == "Blue").FirstOrDefault(); 

यह हूँ बदला जा सकता है की तरह एक सा लगेगा अगर भविष्यवाणी मेल नहीं खाती है तो null पर वापस आएं।

+3

कहां के लिए कोई ज़रूरत नहीं है। FirstOrDefault भी भविष्यवाणी ले जाएगा। – Stephan

+3

आप सीधे 'FirstOrDefault()' पर पूर्वानुमान निर्दिष्ट कर सकते हैं और 'कहां() 'बाहर छोड़ सकते हैं। –

+0

आह, आप सही हैं, भविष्यवाणी के बारे में भूल गए हैं। – Aren

8

जेरेड सही है यदि आप एक नीली कार की तलाश में हैं, तो कोई नीली कार पर्याप्त होगी। क्या आप यही खोज रहे हैं, या आप नीली कारों की सूची ढूंढ रहे हैं?

पहले नीले रंग की कार:

Car oneCar = cars.FirstOrDefault(c => c.Color.Equals("Blue")); 

नीले कारों की सूची:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue")); 
+0

धन्यवाद, और यदि आप बिल्कुल एक नीली कार की तलाश में हैं: कारें। सिंगल (कार => कार। रंग। एक्वाल्स ("ब्लू") –

+0

सिंगल ठीक है अगर आपको पूरी सूची में केवल एक कार होने की गारंटी है। यदि आपके पास एक से अधिक कार हैं, या कोई कार नहीं है, तो आप एक अवैधऑपरेशन अपवाद फेंकने जा रहे हैं। फर्स्टऑर्डडिफॉल्ट आपकी नीली कार, या डिफ़ॉल्ट प्रकार (अक्सर शून्य) वापस कर देगा। अगर कोई मेल नहीं खाता तो पहले अपवाद फेंक देगा भविष्यवाणी – StyxRiver