2015-01-02 7 views
7

को सरणी परिवर्तित मेरे आश्चर्य करने के लिए, मैं निम्नलिखित बयान मिलता है:IEnumerable <T>

public static IEnumerable<SomeType> AllEnums 
    => Enum.GetValues(typeof(SomeType)); 

System.Collection.Generic.IEnumerable को System.Arrayसे बदलने में सक्षम नहीं होने के बारे में शिकायत करने के। मैंने सोचा कि उत्तरार्द्ध पूर्व से विरासत में था। जाहिर है मैं गलत था।

चूंकि मैं LINQ या नहीं कर सकता। टोलिस्ट यह, मुझे यकीन नहीं है कि इसे ठीक से कैसे निपटें। मैं स्पष्ट कास्टिंग से परहेज करना पसंद करूंगा और, क्योंकि यह enum के मानों का एक गुच्छा है, मुझे लगता है कि कुछ टाइप के रूप में नहीं है- यह बहुत अधिक उपयोग नहीं होगा, न ही।

+0

'Enum.GetValues' रिटर्न एक' Array' जो दृढ़ता से टाइप नहीं है। तो यहां कोई आश्चर्य नहीं है। –

उत्तर

12

सामान्य Array बेस क्लास टाइप नहीं किया गया है, इसलिए यह किसी भी प्रकार-विशिष्ट इंटरफेस को लागू नहीं करता है; हालांकि, वेक्टर सीधे डाला जा सकता है - और GetValues वास्तव में एक वेक्टर लौटाता है; इसलिए:

public static IEnumerable<SomeType> AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType)); 

या शायद सरल:

public static SomeType[] AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType)); 
4

मैंने सोचा कि उत्तरार्द्ध पूर्व से विरासत में था।

Enum.GetValues रिटर्न Array, जो गैर सामान्य IEnumerable लागू करता है, ताकि आप एक डाली जोड़ने की जरूरत:

public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType)) 
    .Cast<SomeType>() 
    .ToList(); 

यह LINQ के साथ काम करता है क्योंकि Cast<T> विस्तार पद्धति गैर सामान्य IEnumerable इंटरफेस के लिए परिभाषित किया गया है , न केवल IEnumerable<U> पर।

संपादित करें:ToList() बचने अक्षमता का एक कॉल कई बार एक IEnumerable<T> आस्थगित निष्पादन के साथ LINQ तरीकों द्वारा उत्पादित चलने के साथ जुड़े। धन्यवाद, मार्क, एक महान टिप्पणी के लिए!

+0

जब भी इसे एक्सेस किया जाता है तो यह बॉक्सिंग और अनबॉक्सिंग होगा, नोट करें। –

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