2010-07-21 18 views
26

मुझे यकीन नहीं है कि ASP.Net का ControlCollection कैसे काम करता है, इसलिए शायद कोई मेरे लिए इस पर कुछ प्रकाश डाल सकता है।नियंत्रण संग्रह सभी IENumerable विधियों को क्यों प्रदान नहीं करता है?

मैंने हाल ही में विस्तारित विधियों और लिंक के जादू की खोज की है। ठीक है, मुझे लगता है कि यह मान्य सिंटैक्स

var c=Controls.Where(x => x.ID=="Some ID").SingleOrDefault(); 

हालांकि से मैं क्या बता सकते हैं नहीं है खोजने के लिए बहुत दुख की बात थी, ControlsIEnumerable इंटरफ़ेस है जो इस तरह के तरीकों को प्रदान करता है को लागू करता है, तो क्या देता है? वह क्यों काम नहीं करता है? मैं कम से कम इस समस्या के लिए चारों ओर एक सभ्य काम मिल गया है:

var list = (IEnumerable<Control>)Controls; 
var this_item = list.Where(x => x.ID == "Some ID").SingleOrDefault(); 
+0

आप 'सूची कर सकते हैं। SingleOrDefault (x => x.ID == "कुछ आईडी"); ' –

उत्तर

56

नहीं है, IEnumerable उस पर कई विस्तार विधियां नहीं: IEnumerable<T> करता है। वे दो अलग इंटरफेस हैं, हालांकि IEnumerable<T>IEnumerable फैलाता है।

परिवर्तित करने की सामान्य LINQ तरीके Cast<T>() और OfType<T>() विस्तार तरीकों जो करना उपयोग करने के लिए nongeneric इंटरफ़ेस का विस्तार कर रहे हैं:

IEnumerable<TextBox> textBoxes = Controls.OfType<TextBox>(); 
IEnumerable<Control> controls = Controls.Cast<Control>(); 

दोनों के बीच अंतर यह है कि OfType बस किसी भी आइटम जो नहीं कर रहे छोड़ देगा है आवश्यक प्रकार का नहीं; Cast इसके बजाय एक अपवाद फेंक देगा।

एक बार जब आप जेनेरिक IEnumerable<T> प्रकार के संदर्भ प्राप्त कर लेते हैं, तो बाकी सभी LINQ विधियां उपलब्ध हैं।

6

ऐसा इसलिए है क्योंकि ControlCollection कक्षा जेनेरिक से पहले आया था; इसलिए यह IEnumerable लागू करता है लेकिन IEnumerable<Control> नहीं है। Cast<T>:

सौभाग्य से, IEnumerable इंटरफ़ेस आपको करने के लिए एक IEnumerable<T> उत्पन्न कास्टिंग के माध्यम से की अनुमति देता है कि एक LINQ विस्तार विधि मौजूद नहीं है। आप हमेशा से ही ऐसा कर सकते हैं इसका मतलब है:

var c = Controls.Cast<Control>().Where(x => x.ID == "Some ID").SingleOrDefault(); 
4

जॉन स्कीट और दान ताओ द्वारा प्रदान की जवाब के अलावा, आप स्पष्ट रूप से प्रकार प्रदान करके क्वेरी अभिव्यक्ति सिंटैक्स का उपयोग कर सकते हैं।

Control myControl = (from Control control in this.Controls 
        where control.ID == "Some ID" 
        select control).SingleOrDefault(); 
1

लिंक ने जेनेरिक संग्रह का उपयोग किया। ControlsCollection IEnumerable नहीं IEnumberable<T>

लागू करता है तो आप इस

((IEnumerable)page.Controls).Where(... 

काम नहीं करेगा हालांकि, तो ऐसा करता

((IEnumerable<Control>)page.Controls).Where(... 

आप या तो सामान्य IEnumerable<T> को कच्चा या एक विस्तार विधि ऐसा करता है, का उपयोग इसलिए:

page.Controls.OfType<Control>().Where(c => c.ID == "Some ID").FirstOrDefault(); 
संबंधित मुद्दे

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