Как я могу создать перечисление, используя числа? - PullRequest
11 голосов
/ 01 июня 2010

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

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

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

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

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

Ответы [ 7 ]

16 голосов
/ 01 июня 2010

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

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

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

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

Теперь, если вы действительно хотите, это назначить конкретные значения для записей в перечислении GainValues, , которые вы МОЖЕТЕ сделать:

private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 };
10 голосов
/ 10 июня 2013

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

using System.ComponentModel.DataAnnotations;

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

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

5 голосов
/ 11 ноября 2012

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

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

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

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

4 голосов
/ 01 июня 2010
private enum GainValues { One = 1, Two = 2, Four = 4, Eight = 8 }

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

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

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

0 голосов
/ 02 июня 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>

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

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

0 голосов
/ 01 июня 2010

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

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

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

0 голосов
/ 01 июня 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 valueFromDB = 4;

GainValues enumVal = (GainValues) valueFromDB;

// enumVal should be 'Four' now
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...