2012-09-16 12 views
9

Eventuali duplicati:
IEnumerable Extension Methods on an Enum
How can I use Generics to create a way of making an IEnumerable from an enum?Come posso creare un IEnumerable da un enum

enumerazioni Attribuite come questo:

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

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

Come posso convertire questi in una lista IEnumerable con due campi s chiamato "data" e "valore". Sarebbe possibile avere un metodo generico o un modo per farlo? Per favore, non che i valori non siano sempre sequenziali.

+3

Vuoi un IEnumerable di Tuple, un IDictionary o cosa? – Theraot

+0

Penso che sarebbe necessario essere un IDictionary in quanto ho bisogno di nomi di campi. Gradirei qualsiasi consiglio che tu possa darmi con questo. –

+1

Controlla la risposta di driis per IEnumerable di Tipi anonimi (potrebbero anche essere Tuples), controlla il mio per un IDictionary bit old school (no Linq). – Theraot

risposta

10

È possibile utilizzare Enum.GetValues:

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

Grazie, ho visto gli GetValues ​​ma non sono sicuro di come prenderli e metterli in una collezione con nomi di campi? –

+0

Si prega di consultare la risposta aggiornata, in cui seleziono i valori interi e il loro nome in un 'IEnumerable' utilizzando un tipo anonimo. Da lì, mettili nella struttura dati di cui hai bisogno. – driis

+0

Lo proverò ora. Penso che sia quello di cui ho bisogno. –

3

ne dite:

//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

si può provare questo:

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

EDIT

con cast invece di OfType

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

Forse 'Cast' invece di' OfType'? – abatishchev

Problemi correlati