2010-06-01 20 views
7

È possibile creare un enum utilizzando solo numeri in C#? Nel mio programma ho una variabile, Gain, che può essere impostata solo su 1, 2, 4 e 8. Sto usando un controllo propertygrid per visualizzare e impostare questo valore. Se dovessi creare un enum come questo ...Come posso creare un enum usando i numeri?

private enum GainValues {One, Two, Four, Eight} 

e ho fatto il mio guadagno variabile di tipo GainValues ​​poi l'elenco a discesa nella PropertyGrid avrebbe mostrato solo i valori disponibili per il guadagno variabile. Il problema è che voglio che i valori di guadagno leggano numericamente non come parole. Ma non riesco a creare un enume come questo:

private enum GainValues {1,2,4,8} 

Quindi c'è un altro modo per farlo? Forse creando un tipo personalizzato?

risposta

15

Questo non è il modo in cui funziona enums. Un'enumerazione consente di denominare un valore specifico in modo da poterlo riferire nel codice in modo più ragionevole.

Se si desidera limitare il dominio di valori numerici validi, le enumerazioni potrebbero non essere la scelta giusta. Un'alternativa, è quello di creare una semplice raccolta di valori validi che può essere utilizzato come guadagni:

private int[] ValidGainValues = new []{ 1, 2, 4, 8}; 

Se si vuole fare questo più typesafe, si potrebbe anche creare un tipo personalizzato con un costruttore privato, definire tutti i valori validi come istanze pubbliche statiche e quindi esporli in questo modo. Ma dovrai comunque assegnare un nome a ciascun valore valido, poiché in C# i nomi di variabili/variabili non possono iniziare con un numero (sebbene possano contenerli).

Ora, se ciò che si vuole veramente, è quello di assegnare valori specifici per voci in un'enumerazione GainValues, che si può fare:

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }; 
+0

Probabilmente vorresti rendere questo statico in sola lettura, e forse interno o pubblico in base ai requisiti dello scope, ma sì, questa è la soluzione migliore. –

+0

@ Cat in nylon: Sì, buona parte dell'elettricità statica/di sola lettura, anche se in pratica bisognerebbe che fosse una raccolta come Elenco piuttosto che una matrice per rafforzare realmente l'immutabilità. – LBushkin

4
private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 } 

dovrebbe funzionare.

Aggiornamento: OK, penso di aver frainteso lì.

Forse è possibile utilizzare uno KeyValuePair<string, int> e quindi associare il nome e il valore rispettivamente alla proprietà Key e Value.

+0

Non è chiaro che questo è ciò che l'OP sta cercando. Sembra più che voglia usare i valori numerici letterali come i * nomi * dei membri dell'enumerazione - che è illegale. – LBushkin

+0

@LBushkin: data la descrizione è _probabilmente_ ciò che l'OP vuole. –

+0

@Henk: Non ne sono così sicuro, l'OP scrive: "Il problema è che voglio che i valori di guadagno leggano numericamente non come parole. La mia interpretazione è che l'OP vuole un elenco limitato di valori validi per i guadagni, piuttosto che una enumerazione con nome. – LBushkin

0

uso assegnazione valore esplicito nella enum:

private enum GainValues 
{ 
    One = 1, 
    Two = 2, 
    Four = 4, 
    Eight = 8 
} 

Poi per enumerare questi valori procedere come segue:

GainValues currentVal; 

foreach(currentVal in Enum.GetValues(typeof(GainValues)) 
{ 
    // add to combo box (or whatever) here 
} 

Quindi è possibile lanciare da/int come necessario:

int valueFromDB = 4; 

GainValues enumVal = (GainValues) valueFromDB; 

// enumVal should be 'Four' now 
0

Purtroppo, simboli in C# può contenere numeri, ma non può inizio con numeri. Quindi dovrai usare le parole.

In alternativa, si potrebbe fare Guadagno1, GAIN2, ecc

Oppure si potrebbe rinunciare un enum del tutto e utilizzare le costanti e elaborazione interna.

0

È possibile utilizzare un elenco personalizzato come origine dati per il proprio elenco a discesa.

Codice Dietro:

using GainItem = KeyValuePair<string, int>; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      List<GainItem> dic = new List<GainItem>(); 
      dic.Add(new GainItem("First", 1)); 
      dic.Add(new GainItem("Second", 2)); 
      dic.Add(new GainItem("Fourth", 4)); 
      ddl.DataSource = dic; 
      ddl.DataBind(); 
     } 


    } 

    protected void btn_Click(object sender, EventArgs e) 
    { 
     Response.Write(ddl.SelectedValue); 
    } 
} 

Asp Pagina:

<div> 
    <asp:DropDownList runat="server" ID="ddl" DataValueField="Value" DataTextField="Key" /> 
    <asp:Button ID="btn" runat="server" OnClick="btn_Click" /> 
    </div> 

Inoltre, si può avere enum per l'impostazione valore predefinito, ...

speranza che questo aiuta

5

Se ho capito correttamente la domanda originale, la risposta potrebbe essere questa:

è possibile ottenere numeri elencati in un enum nella finestra di ispezione, semplicemente utilizzando un prefisso di sottolineatura, per esempio:

public enum MyNumbers{ _1, _2, _3, _4 }; 
public MyNumbers myNumbers; 

Spero che questo è aiuta!

10

Ci sono già state molte risposte a questo proposito, ma offrirò un'altra soluzione. Se vuoi che il tuo controllo mostri un numero effettivo rispetto alla parola inglese per il numero nel tuo controllo, puoi utilizzare le annotazioni dei dati.

using System.ComponentModel.DataAnnotations; 

private enum GainValues 
{ 
[Display(Name = "1")] 
One, 
[Display(Name = "2")] 
Two, 
[Display(Name = "4")] 
Four, 
[Display(Name = "8")] 
Eight 
} 

Questo è utile in qualsiasi punto del programma in cui si desidera utilizzare un nome descrittivo anziché il nome effettivo di un membro.

Problemi correlati