2012-09-16 23 views
9

Duplicar posible:
IEnumerable Extension Methods on an Enum
How can I use Generics to create a way of making an IEnumerable from an enum?¿Cómo puedo crear un IEnumerable de una enumeración

enumeraciones Dadas así:

public enum City 
{ 
    London = 1, 
    Liverpool = 20, 
    Leeds  = 25 
} 

public enum House 
{ 
    OneFloor = 1, 
    TwoFloors = 2 
} 

¿Cómo puedo convertir estos en una lista de IEnumerable con dos campos s nombrado "datos" y "valor". ¿Sería posible tener un método genérico o una forma de hacerlo? Por favor, no que los valores no sean siempre secuenciales.

+3

¿Quieres un IEnumerable de Tuple, un IDictionary o qué? – Theraot

+0

Creo que necesitaría ser un IDictionary ya que necesito nombres de campo. Agradecería cualquier consejo que me puedas dar con esto. –

+1

Comprueba la respuesta de driis para IEnumerable de tipos anónimos (pueden ser también Tuples), revisa el mío para ver un poco de la vieja escuela (no Linq) IDictionary. – Theraot

Respuesta

10

Puede utilizar Enum.GetValues:

City[] values = (City[])Enum.GetValues(typeof(City)); 
var valuesWithNames = from value in values 
         select new { value = (int)value, name = value.ToString() }; 
+0

Gracias. Vi los GetValues ​​pero no estoy seguro de cómo tomarlos y ponerlos en una colección que tenga nombres de campo. –

+0

Consulte la respuesta actualizada, donde selecciono los valores enteros y sus nombres en un 'IEnumerable' utilizando un tipo anónimo. A partir de ahí, colóquelos en la estructura de datos que necesita. – driis

+0

Voy a intentar esto ahora. Creo que es lo que necesito –

3

¿Qué tal:

//Tested on LINQPad 
void Main() 
{ 
    var test = GetDictionary<City>(); 
    Console.WriteLine(test["London"]); 
} 

public static IDictionary<string, int> GetDictionary<T>() 
{ 
    Type type = typeof(T); 
    if (type.IsEnum) 
    { 
     var values = Enum.GetValues(type); 
     var result = new Dictionary<string, int>(); 
     foreach (var value in values) 
     { 
      result.Add(value.ToString(), (int)value); 
     } 
     return result; 
    } 
    else 
    { 
     throw new InvalidOperationException(); 
    } 
} 

public enum City 
{ 
    London = 1, 
    Liverpool = 20, 
    Leeds = 25 
} 
1

Usted puede intentar esto:

var cities Enum.GetValues(typeof(City)).OfType<City>() 
       .Select(x => 
        new 
        { 
         Value = (int)x, 
         Text = x.ToString() 
        }); 

EDITAR

con yeso en lugar de OfType

var cities = ((IEnumerable<City>)Enum.GetValues(typeof(City))) 
            .Select(x => 
             new 
             { 
              Value = (int)x, 
              Text = x.ToString() 
             }); 
+4

¿Tal vez 'Cast' en lugar de' OfType'? – abatishchev

Cuestiones relacionadas