Проверьте 3 значения перечисления за один раз? - PullRequest
1 голос
/ 19 июля 2010

У меня есть перечисление, которое выглядит так:

enum myEnum
{
    field1 = 11,
    field2 = 12,
    field3 = 33
};

В моем коде я должен сказать, что field1 равно 1, field2 равно 2 и field3 равно 3 в соответствии с моей переменной Эта переменная либо 1, либо 2, либо 3; это инт. Могу ли я написать это в одну строку? Что-то вроде следующего, но короче ...

if(myVar == 1)
    SomeMethod(myEnum.field1)
...

Спасибо: -)

Ответы [ 6 ]

7 голосов
/ 19 июля 2010
(myEnum) Enum.Parse(typeof(myEnum), "field" + myVar);

Редактировать: Если подумать, вы, вероятно, захотите обернуть это в try/catch (ArgumentException) на случай, если в перечислении нет значения для данного myVar, если только вы не можете гарантировать, что это будетникогда не случится.

Другое редактирование: Подумав об этом, если есть только три значения, вы можете просто сделать:

myVar == 1 ? myEnum.field1 : myVar == 2 ? myEnum.field2 : myEnum.field3;

Однако, это обрабатывает любое значение, кроме 1 или 2, как если бы онобыло 3, но если это гарантировано, это не должно быть проблемой.

3 голосов
/ 19 июля 2010

Если я вас правильно понимаю (а если нет, то просьба расширить ваш вопрос, поскольку он не очень понятен), вы захотите сделать что-то вроде этого:

private static readonly Dictionary<int, MyEnum> _dict = new Dictionary<int, MyEnum> {
   {1, MyEnum.field1},
   {2, MyEnum.field2},
   {3, MyEnum.field3}
};


public MyEnum GetIt(int val)
{
  if (!_dict.ContainsKey(val)) throw new ArgumentException("val");

  return _dict[val];
}
1 голос
/ 19 июля 2010

Звучит так, как будто вы ищете Побитовые операции .Определив в вашем перечислении только один бит для каждого из значений, вы можете выполнить несколько интересных операций, включая ту, о которой, я думаю, вы спрашиваете.Чтобы определить перечисление для использования таким образом, вы можете использовать что-то вроде следующего:

   [Flags]                             
    enum myEnum :int
    {
        None     = 0,
        field1   = (1 << 0),      //1     binary: 001
        field2   = (1 << 1),      //2             010   
        field3   = (1 << 2),      //4             100

        anyfield = (1 << 3) -1,   //              111

        field1or2 = (field1 | field2),//          011
        field1or3 = (field1 | field3),//          101
        field2or3 = (field2 | field3),            110  

    }

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

        //set to field2or3
        myEnum myvar = myEnum.field2or3;

        //add in field1
        myvar |= myEnum.field1;
        //clear field2
        myvar &= myEnum.field2;

        //true because field1 is set, even though field2 is not
        if ((myvar & myEnum.field1or2) != myEnum.None) 
        {
           //...
        } 

или

if((myvar & (int)myEnum.field1or2) != 0) 

, если myvar является int (C # требует явного приведения к int, в отличие от C ++).Побитовые операции поначалу немного сложны, но с небольшой практикой вы сможете понять это.

1 голос
/ 19 июля 2010

Похоже, что оператор switch будет лучше, чем множество ifs.

switch (myVar)
{
    case 1:
        // do stuff
        break;
    case 2:
        // do stuff
        break;
    case 3:
        // do stuff
        break;
}
0 голосов
/ 19 июля 2010

Другой способ (учитывая, что перечисление сортируется по его значениям при использовании GetValues):

myEnum blah = (myEnum)Enum.GetValues(typeof(myEnum)).GetValue(myVar - 1);
0 голосов
/ 19 июля 2010

Вы пытались использовать оператор switch вместо if против значения? Попробуйте этот код, который предполагает тип перечисления, который вы объявили в своем вопросе. Приведите myVar к типу myEnum в выражении switch и "viola!" мгновенное отображение!:

        var myVar = 11;
        switch ((myEnum)myVar)
        {
            case myEnum.field1:
                //Code will hit here.
                break;
            case myEnum.field2:
                break;
            case myEnum.field3:
                break;
            default:
                break;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...