2010-07-01 13 views
5

Ho circa 30 enumerazioni diverse segnalate che vorrei inserire in un array per l'indicizzazione e l'accesso rapido. Lasciatemi anche affermare che non ho 1 enum con 30 valori ma ho 30 enum con diverse quantità di valori.Come creare un array di enumerazioni

L'obiettivo sarebbe quello di aggiungerli a un array in un indice specificato. In questo modo posso scrivere una funzione in cui posso passare l'indice della matrice per impostare valori di particuler dell'enum.

Aggiornamento: Ecco un esempio di ciò che sto cercando di fare.

enum principale ( enum1 = 0, enum2 = 1, enumn = n-1) - questo ha indexs che corrisponderebbe l'indice del enumerazione associato

[flag] enum1 (value1 = 0 , value2 = 1, value3 = 2, valore4 = 4 ...)

[flag] enum2 ("")

[flag] enum2 ("")

dal momento che sto usando enumerazioni flagable Ho una classe come la seguente

public static class CEnumWorker 
{ 
    public static enum1 myEnum1 = enum1.value1; 
    public static enum2 myEnum2 = enum2.value1; 
    public static enumN myEnumN = enumN.value1; 

    //I would then have functions that set the flags on the enums. I would like to access the enums through an array or other method so that I do not have to build a large switch statement to know which enum I am wanting to manipulate 
} 
+10

Forse un esempio di codice potrebbe aiutare ... ma questo non ha senso per me. –

+3

perché desideri inserire diversi tipi nello stesso array? – fbstj

+2

"Per l'indicizzazione e l'accesso rapido"? Da chi o da cosa? Vuoi mettere un sacco di interi, stringhe e float in una matrice per l'indicizzazione e l'accesso rapido? Perché vuoi trattare queste enumerazioni come entità correlate? Sospetto fortemente che qualunque cosa tu voglia fare, lanciare enum in un array è la soluzione sbagliata. –

risposta

15

Poiché si dispone di 30 diversi tipi di enumerazione, non è possibile creare un array fortemente tipizzato. Il meglio che si possa fare sarebbe un array di System.Enum:

Enum[] enums = new Enum[] { enum1.Value1, enum2.Value2, etc }; 

Si potrebbe quindi avere a lanciare quando si tira fuori un enum dell'array se è necessario il valore enum fortemente tipizzato.

+0

Non c'è alcun vantaggio in questo senso rispetto a digitare l'array come 'oggetto'. 'ValueType' è (unintuitivamente) un tipo di riferimento, quindi i valori saranno ancora in scatola. –

+1

Quindi, perché non direttamente Enum []? – digEmAll

+0

@digEmAll - dovresti comunque eseguire il cast, ma almeno l'array non può contenere nulla che non sia un enum. –

0

Si può sempre utilizzare il buon vecchio object[], ma questo significa fare un sacco di casting.

2

Se ho capito bene, si dovrebbe fare:

object[] enums = new object[30]; 
enums[0] = Enum1.Value1; 
enums[1] = Enum2.AnotherValue; 

Ma poi si dovrà accedere come questo (non fortemente tipizzato, e facile per fare riferimento l'indice sbagliato):

if ((Enum1)enums[0] == Enum1.Value1) 
... 

In .NET 4, è possibile utilizzare il Tuple:

var enums = new Tuple<Enum1, Enum2>(Enum1.Value1, Enum2.AnotherValue); 

if (enums.Item1 == Enum1.Value1) 
... 

... ma io non lo consiglio per tanti (30) enumerazioni, e penso che ci sia anche un limite di 8 o giù di lì. È inoltre possibile creare la propria classe:

class Enums 
{ 
    public Enum1 Enum1 { get; set; } 
    public Enum2 Enum2 { get; set; } 
} 

Enums enums = new Enums(); 
enums.Enum1 = Enum1.Value1; 
enums.Enum2 = Enum2.AnotherValue; 

if (enums.Enum1 == Enum1.Value1) 
... 

mi sento di raccomandare l'ultimo modo perché si sta utilizzando un tipo di riferimento, non sei dipendente dalla posizione di indice, si può dare le proprietà qualsiasi nome che si desidera, e è fortemente digitato L'unica cosa che "perdi" è la capacità di scorrere facilmente l'elenco, ma puoi farlo con Reflection se davvero ne hai bisogno.

+0

Mabye lo rende una struct al posto di una classe. – Dykam

+0

C'è un limite di 8 parametri generici nel tipo di tupla. Per convenzione l'ultimo parametro generico è una tupla contenente i valori addizionali in modo da poter creare una tupla con più di 8 usando qualcosa come: var a = nuova Tupla >(); ma non sarebbe molto bello da gestire. –

+0

@Dykam: una struct viene generalmente utilizzata per * un * valore per impedire un oggetto grande con più copie. Se avessi qualche enumerazione, forse, ma penso che 30 enumeri dovrebbero essere davvero un tipo di riferimento. –

0

Enum prevede due meccanismi per la conversione di un numero intero a un valore di enumerazione - le GetValues ​​() e di fusione pianura:

enum EnumA { A1, A2, A1234 } 
enum EnumB { B00, B01, B02, B04 } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     EnumA a = ((EnumA[])Enum.GetValues(typeof(EnumA)))[0]; 

     Console.WriteLine(a); 

     EnumB boa = (EnumB)3; 

     Console.WriteLine(boa); 
    } 
} 

io non sono del tutto sicuro perché si vuole creare i propri array, se potete utilizzare uno di questi meccanismi per ottenere un enum da un int.

Problemi correlati