2010-06-01 9 views
7

Ist es möglich, eine Enum mit nur Zahlen in C# zu machen? In meinem Programm habe ich eine Variable, Gain, die nur auf 1, 2, 4 und 8 gesetzt werden kann. Ich verwende ein propertygrid-Steuerelement, um diesen Wert anzuzeigen und festzulegen. Wenn ich eine Enumeration wie diese erstellen war ...Wie kann ich ein enum mit Zahlen erstellen?

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

und machte ich meinen Gewinn Variable vom Typ GainValues ​​dann die Dropdown-Liste in der Property nur die verfügbaren Werte für die Verstärkung variabel zeigen würde. Das Problem ist, ich möchte die Gain-Werte numerisch und nicht als Wörter lesen. Aber ich kann nicht eine Enumeration wie folgt erstellen:

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

So gibt es eine andere Art und Weise, dies zu tun? Vielleicht einen benutzerdefinierten Typ erstellen?

Antwort

15

Dies ist nicht wie arbeiten. Mit einer Aufzählung können Sie einen bestimmten Wert benennen, damit Sie in Ihrem Code sinnvoller darauf Bezug nehmen können.

Wenn Sie die Domäne von gültigen numerischen beschränken möchten, sind Enums möglicherweise nicht die richtige Wahl. Alternativ ist nur eine Sammlung von gültige Werte zu schaffen, die als Verstärkungen verwendet werden können:

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

Wenn Sie diese mehr typsicher machen möchten, können Sie auch einen benutzerdefinierten Typ mit einem privaten Konstruktor erstellen könnte, Definieren Sie alle gültigen Werte als statische öffentliche Instanzen, und legen Sie sie dann auf diese Weise offen. Aber Sie müssen immer noch jedem gültigen Wert einen Namen geben - da in C# Member-/Variablennamen nicht mit einer Zahl beginnen können (obwohl sie sie enthalten können).

Nun, wenn, was Sie wirklich wollen, ist bestimmte Werte Einträge in einer GainValues ​​Aufzählung zuweisen, die Sie tun können:

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

Wahrscheinlich möchten Sie diese statische readonly, und vielleicht interne oder öffentliche abhängig von Umfang Anforderungen machen, aber ja, das ist die beste Lösung. –

+0

@Cylon Cat: Ja, ein guter Punkt über die statische/readonly, obwohl in der Praxis würde es eine Sammlung wie List und nicht ein Array, um wirklich Unveränderlichkeit zu erzwingen. – LBushkin

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

sollte funktionieren.

Update: OK, ich glaube, ich habe dich dort missverstanden.

Vielleicht könnten Sie eine KeyValuePair<string, int> verwenden und dann den Namen und den Wert an die Key und Value-Eigenschaft jeweils binden.

+0

Es ist nicht klar, dass dies das ist, was das OP sucht. Es sieht eher so aus, als ob er die numerischen Literalwerte als * Namen * der Aufzählungselemente verwenden möchte - was illegal ist. – LBushkin

+0

@LBushkin: Angesichts der Beschreibung ist es _wahrscheinlich, was das OP will. –

+0

@Henk: Ich bin mir nicht so sicher, das OP schreibt: 'Das Problem ist, ich will die Gain-Werte numerisch lesen und nicht als Worte. Meine Interpretation ist die OP will eine begrenzte Liste gültiger Werte für Gewinne, statt eine benannte Aufzählung. – LBushkin

0

Verwendung expliziter Wertzuweisung in der Enum:

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

Dann tun diese Werte aufzuzählen durch wie folgt:

GainValues currentVal; 

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

Dann können Sie werfen zu/von ints wie nötig:

int valueFromDB = 4; 

GainValues enumVal = (GainValues) valueFromDB; 

// enumVal should be 'Four' now 
0

Leider Symbole in C# Zahlen enthalten kann, kann aber nicht Start mit Zahlen. Also wirst du Wörter benutzen müssen.

Alternativ könnten Sie tun Gain1, Gain2 usw.

Oder Sie könnten eine ENUM zusammen und verwenden Konstanten und interne Verarbeitung verzichten.

0

Sie können eine benutzerdefinierte Liste als Datenquelle für Ihre Dropdown-Liste verwenden.

-Code Behind:

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 Seite:

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

Darüber hinaus können Sie Enum für die Einstellung Standardwert haben, ...

hoffe, das hilft

5

Wenn ich die ursprüngliche Frage richtig verstanden habe, lautet die Antwort:

Sie können Zahlen in einer Enum im Inspektor aufgelistet bekommen, indem Sie einfach einen Unterstrich Präfix, z:

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

Hoffnung ist dies hilft!

10

Es gab schon eine Menge Antworten darauf, aber ich werde eine andere Lösung anbieten. Wenn Sie möchten, dass Ihr Steuerelement eine tatsächliche Zahl im Gegensatz zu dem englischen Wort für die Nummer in Ihrem Steuerelement anzeigt, können Sie Datenanmerkungen verwenden.

Dies ist überall in Ihrem Programm nützlich, wo Sie einen benutzerfreundlichen Namen anstelle des tatsächlichen Namens eines Mitglieds verwenden möchten.

Verwandte Themen