2009-11-17 5 views
24

Ho un enum (sotto) che voglio essere in grado di utilizzare un metodo di estensione LINQ su.IEnumerable Metodi di estensione su un Enum

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

Enum.GetValues ​​(...) è di tipo ritorno System.Array, ma io non riesco a ottenere l'accesso ad un estensione ToList() o qualsiasi altra cosa del genere.

Sto solo cercando di scrivere qualcosa di simile ...

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

C'è qualcosa che mi manca, o qualcuno può spiegarmi perché questo non è possibile?

Grazie.

risposta

41

Enum.GetValues restituisce un System.Array e System.Array implementa solo IEnumerable piuttosto che IEnumerable<T> quindi sarà necessario utilizzare il metodo Enumerable.OfType estensione per convertire il IEnumerable-IEnumerable<Suit> in questo modo:

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

Edit: ho rimosso la chiamata a IEnumerable.Select come fosse una proiezione superflua senza alcuna traduzione significativa. È possibile filtrare liberamente lo IEnumerable<Suit> restituito da OfType<T>.

+1

Tendo a vedere 'OfType' più appropriato per quando si sta cercando di filtrare un elenco e' Cast' per il casting. C'è un motivo per usare 'Int32' piuttosto che' Suit'? –

+0

Per qualsiasi 'IEnumerable' che contiene tipi omogenei,' OfType 'e' Cast 'eseguiranno e si comportano in modo praticamente identico. Per quanto riguarda l'uso di 'Int32' piuttosto che di' Suit', non sono proprio sicuro del motivo per cui l'ho fatto - la mia risposta è stata corretta. –

+0

Funziona esattamente come stavo cercando. Grazie! – ahawker

7

Array implementa IEnumerable quindi è necessario utilizzare Cast<Suit> o OfType<Suit> per ottenere le estensioni IEnumerble<T> come ToList();