2010-01-04 7 views
8

यदि कोई विधि सिस्टम प्रकार का पैरामीटर लेता है। चयन। क्या मैं वैध रूप से/सुरक्षित रूप से System.Collections.Generic.IEnumerable<T> प्रकार का मान पास कर सकता हूं?आईनेमरेबल <T> का रूपांतरण IList

मैं इस बात के बारे में पूरी तरह से स्पष्टीकरण की सराहना करता हूं कि यह संभव क्यों है और T पर वास्तव में क्या होता है जब IEnumerable<T> विधि के अंदर उपयोग किया जाता है।

यह वस्तु के आधार प्रकार में बदल जाती है?

क्या यह System.Collections.IEnumerable के रूप में उपयोग किया जाता है?

क्या कोई परिदृश्य है जहां इससे समस्याएं पैदा होंगी (यानी प्रदर्शन समस्याएं)?

अग्रिम धन्यवाद, जॉन

उत्तर

25

नहीं, आप एक तरीका है जिसके IList लेता है के लिए एक IEnumerable<T> पारित नहीं कर सकते हैं। इंटरफ़ेस IEnumerable<T>IList में कनवर्ट करने योग्य नहीं है और IEnumerable<T> प्रकार के चर को IList लेने के तरीके को पास करने का प्रयास करने के परिणामस्वरूप संकलन त्रुटि होगी।

आदेश में इस काम आप इसके बजाय एक IEnumerable<T> होने के निम्नलिखित

  1. में से एक करने की आवश्यकता होगी बनाने के लिए, एक प्रकार है जो IEnumerable<T> और IList दोनों को लागू करता है के लिए एक संदर्भ बनाए रखें। List<T> यहां एक अच्छा उम्मीदवार है
  2. IEnumerable<T> उदाहरण को एक नई वस्तु में कनवर्ट करें जो परिवर्तनीय है IList। उदाहरण के लिए, 3.5+ में आप गणना पर List<T> बनाने के लिए .ToList() एक्सटेंशन विधि को कॉल कर सकते हैं।
2

नहीं, आप नहीं कर सकते हैं, ToList() विस्तार विधि का उपयोग कर के बिना। मुझे लगता है कि इस का कारण नहीं होना चाहिए एक प्रदर्शन समस्या का कि बड़ा - अगर आप एक विकल्प है, उन्हें समय और तुलना की है।

तुम भी new List<T>(myIEnumerable) इस्तेमाल कर सकते हैं - प्रलेखन का कहना है कि समारोह एक O(n) ऑपरेशन है कि है, लेकिन मैं और ToList() बारे में कुछ भी नहीं मिल रहा। यह भी ध्यान रखें कि List<T> भी IList लागू करता IList<T> के रूप में भी।

1

आईनेमरेबल संग्रह में अनुक्रमित पहुंच की अनुमति नहीं देता है, जबकि आईलीस्ट करता है। इस प्रकार, IList IEnumerable की तुलना में अधिक है और आप इसे के साथ भाग प्राप्त करने में सक्षम नहीं होगा। बेशक, कुछ कक्षाएं दोनों इंटरफेस (उदाहरण के लिए सूची <>) को लागू करने और उन से कार्य करेंगे।

यदि आपको आईन्यूमेरेबल से आईलीस्ट तक जाना है, तो आप भाग्यशाली हो सकते हैं, अगर आप भाग्यशाली हो जाएंगे तो यह काम करेगा। यदि नहीं, तो आप IEnumerable संग्रह से अधिक foreach और एक नया IList निर्माण करना होगा।

संपादित करें: दूसरों के सुझाव के अनुसार स्वयं को पूर्वानुमानित करने के बजाय ToList() का उपयोग करें।

0

नहीं, आप इसे एक आईनेमरेबल पास नहीं कर सकते हैं। IList IENumerable लागू करता है, इसलिए यदि आप अपनी विधि को एक IList पास करते हैं, तो आप इसे सुरक्षित रूप से IENumerable के रूप में उपयोग कर सकते हैं। वी.एस. निम्नलिखित संकलन नहीं:

private static void Test(IList<int> list){ } 

Test(Enumerable.Range(0, 10)); 

त्रुटि दिखाई:

Argument '1': cannot convert from System.Collections.Generic.IEnumerable<int>' to 'System.Collections.Generic.IList<int>' 

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

  • कोई संबंधित समस्या नहीं^_^