Как я могу создать перечисление с помощью чисел?

Можно ли сделать перечисление, используя только числа в C #? В моей программе у меня есть переменная Gain, которая может быть установлена ​​только на 1, 2, 4 и 8. Я использую элемент управления propertygrid для отображения и установки этого значения. Если бы я создал такое перечисление ...

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

и я сделал свою переменную усиления типа GainValues, тогда раскрывающийся список в таблице свойств будет показывать только доступные значения для переменной усиления. Проблема в том, что я хочу, чтобы значения усиления считывались числовыми, а не словами. Но я не могу создать такое перечисление:

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

Так есть ли другой способ сделать это? Возможно создание нестандартного типа?


person PICyourBrain    schedule 01.06.2010    source источник


Ответы (7)


Это не то, как enums работает. Перечисление позволяет вам назвать конкретное значение, чтобы вы могли более разумно ссылаться на него в своем коде.

Если вы хотите ограничить область допустимых числовых значений, перечисления могут быть неправильным выбором. Альтернативой является создание коллекции допустимых значений, которые можно использовать как прибыль:

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

Если вы хотите сделать это более типизированным, вы даже можете создать собственный тип с частным конструктором, определить все допустимые значения как статические общедоступные экземпляры, а затем предоставить их таким образом. Но вам все равно придется дать каждому допустимому значению имя - поскольку в C # имена членов / переменных не могут начинаться с числа (хотя они могут их содержать).

Теперь, если вы действительно хотите присвоить определенные значения записям в перечислении GainValues ​​, вы МОЖЕТЕ сделать следующее:

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 };
person LBushkin    schedule 01.06.2010
comment
Вы, вероятно, захотите сделать это статическим только для чтения, а может быть внутренним или общедоступным, в зависимости от требований к области действия, но да, это лучшее решение. - person Cylon Cat; 01.06.2010
comment
@Cylon Cat: Да, хороший момент по поводу static / readonly, хотя на практике вам понадобится коллекция вроде List ‹int›, а не массив, чтобы действительно обеспечить неизменность. - person LBushkin; 01.06.2010

На этот счет уже есть много ответов, но я предложу другое решение. Если вы хотите, чтобы ваш элемент управления отображал фактическое число, а не английское слово для числа в вашем элементе управления, вы можете использовать аннотации данных.

using System.ComponentModel.DataAnnotations;

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

Это полезно в любом месте вашей программы, где вы хотите использовать понятное имя вместо фактического имени участника.

person Adrian    schedule 09.06.2013

Если я правильно понял исходный вопрос, ответ может быть таким:

Вы можете получить числа, перечисленные в перечислении в инспекторе, просто используя префикс подчеркивания, например:

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

Надеюсь, это поможет!

person lifeboatDave    schedule 11.11.2012

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

должно сработать.

Обновление: Хорошо, я думаю, что я вас неправильно понял.

Возможно, вы могли бы использовать KeyValuePair<string, int>, а затем привязать имя и значение к свойству Key и Value соответственно.

person corvuscorax    schedule 01.06.2010
comment
Непонятно, что именно ищет OP. Похоже, он хочет использовать числовые литеральные значения в качестве имен членов перечисления, что недопустимо. - person LBushkin; 01.06.2010
comment
@LBushkin: учитывая описание, это вероятно то, что хочет OP. - person Henk Holterman; 01.06.2010
comment
@Henk: Я не уверен, OP пишет: The problem is I want the gain values to read numerically an not as words. Моя интерпретация такова, что OP хочет ограниченный список допустимых значений для выигрышей, а не именованное перечисление. - person LBushkin; 01.06.2010
comment
Правильно, PropertyGrid применяет ToString (). Может быть, атрибут Description может помочь, я не уверен: blogs.msdn.com/b/paulwhit/archive/2008/03/31/ - person Henk Holterman; 01.06.2010
comment
@ALL: в основном я хочу, чтобы раскрывающийся список в сетке свойств отображал только 1, 2, 4 и 8 в качестве вариантов усиления. - person PICyourBrain; 01.06.2010

К сожалению, символы в C # могут содержать числа, но не могут начинаться с цифр. Так что тебе придется использовать слова.

В качестве альтернативы вы можете использовать Gain1, Gain2 и т. Д.

Или вы можете вообще отказаться от перечисления и использовать константы и внутреннюю обработку.

person Randolpho    schedule 01.06.2010

используйте явное присвоение значения в перечислении:

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

Затем, чтобы перечислить эти значения, сделайте следующее:

GainValues currentVal;

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

Затем вы можете при необходимости использовать int / ints:

int valueFromDB = 4;

GainValues enumVal = (GainValues) valueFromDB;

// enumVal should be 'Four' now
person Mike Marshall    schedule 01.06.2010

Вы можете использовать один настраиваемый список в качестве источника данных для раскрывающегося списка.

Код позади:

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:

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

Кроме того, у вас может быть перечисление для установки значения по умолчанию, ...

надеюсь это поможет

person Matin Habibi    schedule 01.06.2010