2009-11-17 19 views
24

Tengo una enumeración (a continuación) en la que quiero poder utilizar un método de extensión LINQ.Métodos de extensión IEnumerable en un Enum

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

Enum.GetValues ​​(...) es del tipo de retorno System.array, pero me parece que no puede obtener acceso a una extensión ToList() o cualquier otra cosa por el estilo.

Sólo estoy buscando a escribir algo como ...

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

¿Hay algo que me falta, o puede que alguien me explique por qué esto no es posible?

Gracias.

Respuesta

41

Enum.GetValues devuelve un System.Array y System.Array sólo se implementa IEnumerable en lugar de IEnumerable<T> por lo que tendrá que utilizar el método Enumerable.OfType extensión para convertir el IEnumerable a IEnumerable<Suit> así:

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

Editar: que eliminan la llamada a IEnumerable.Select ya que era una proyección superflua sin ninguna traducción significativa. Puede filtrar libremente el IEnumerable<Suit> que se devuelve desde OfType<T>.

+1

Tiendo a ver 'OfType' más apropiado para cuando buscas filtrar una lista, y' Cast' para fundir. ¿Hay alguna razón para usar 'Int32' en lugar de' Suit'? –

+0

Para cualquier 'IEnumerable' que contenga tipos homogéneos,' OfType 'y' Cast 'funcionarán y se comportarán de forma prácticamente idéntica. En cuanto a usar 'Int32' en lugar de' Suit', no estoy seguro de por qué lo hice, mi respuesta ha sido corregida. –

+0

Funciona como yo estaba buscando. ¡Gracias! – ahawker

7

La matriz implementa IEnumerable por lo que deberá usar Cast<Suit> o OfType<Suit> para obtener las extensiones IEnumerble<T> como ToList();

Cuestiones relacionadas