2009-11-17 36 views
24

पर आईनेमेरेबल एक्सटेंशन विधियां मेरे पास एक enum (नीचे) है कि मैं LINQ एक्सटेंशन विधि का उपयोग करने में सक्षम होना चाहता हूं।एनम

enum Suit{ 
    Hearts = 0, 
    Diamonds = 1, 
    Clubs = 2, 
    Spades = 3 
} 

Enum.GetValues ​​(...) वापसी प्रकार System.Array की है, लेकिन मैं एक ToList() विस्तार या उस तरह की कुछ और तक पहुँच प्राप्त नहीं कर पा रहे।

मैं सिर्फ कुछ की तरह लिखने के लिए देख रहा हूँ ...

foreach(Suit s in Enum.GetValues(typeof(Suit)).Select(x=>x).Where(x=> x != param)){} 

वहाँ कुछ मैं याद कर रहा हूँ, या किसी ने मुझे समझा सकता है क्यों यह संभव नहीं है?

धन्यवाद।

उत्तर

41

Enum.GetValues रिटर्न एक System.Array और System.Array केवल लागू करता IEnumerable बल्कि IEnumerable<T> से तो आप इस तरह IEnumerable<Suit> को Enumerable.OfType विस्तार विधि का उपयोग करने IEnumerable कन्वर्ट करने के लिए की आवश्यकता होगी:

Enum.GetValues(typeof(Suit)) 
      .OfType<Suit>() 
      .Where(x => x != param); 

संपादित करें: मैं कॉल हटाया IEnumerable.Select पर क्योंकि यह किसी भी सार्थक अनुवाद के बिना एक अनिवार्य प्रक्षेपण था। आप को स्वतंत्र रूप से फ़िल्टर कर सकते हैं जो OfType<T> से वापस आ गया है।

+1

जब आप किसी सूची को फ़िल्टर करना चाहते हैं, और कास्टिंग के लिए 'Cast'' के लिए मैं अधिक उपयुक्त 'ऑफ़ टाइप टाइप' देखता हूं। क्या 'सूट' की बजाय 'Int32' का उपयोग करने का कोई कारण है? –

+0

किसी भी 'आईनेमेरेबल' के लिए जिसमें समरूप प्रकार होते हैं, 'ऑफ टाइप ' और 'कास्ट ' वस्तुतः समान रूप से प्रदर्शन और व्यवहार करेगा। 'सूट 'की बजाय' Int32' का उपयोग करने के लिए मुझे सच में यकीन नहीं है कि मैंने ऐसा क्यों किया - मेरा जवाब सही कर दिया गया है। –

+0

वैसे ही काम करता है जैसे मैं ढूंढ रहा था। धन्यवाद! – ahawker

7

ऐरे IENumerable लागू करता है तो आपको का उपयोग IEnumerble<T> एक्सटेंशन जैसे ToList() प्राप्त करने के लिए करना होगा;