2010-07-19 6 views
1

У меня есть перечисление, который выглядит следующим образом:Проверить 3 значения enum за один раз?

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

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

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

Спасибо :-)

+3

Непонятно, что вы имеете в виду. 'field1' будет * всегда * иметь значение 11, так что вы действительно подразумеваете под первым предложением? Аналогично, во втором фрагменте кода вы используете 'field1', но не говорите, что вы делаете с ним. –

+0

Я передаю его методу, который должен иметь 11 вместо 1, например. Я изменил свой пост ... – grady

+0

Кажется, было бы лучше, если бы вы передали 'myVar'' SomeMethod' и построили для него ключ переключения для обработки разных значений 'myVar'. –

ответ

1

Похоже, переключатель заявление было бы лучше много ifs.

switch (myVar) 
{ 
    case 1: 
     // do stuff 
     break; 
    case 2: 
     // do stuff 
     break; 
    case 3: 
     // do stuff 
     break; 
} 
7
(myEnum) Enum.Parse(typeof(myEnum), "field" + myVar); 

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

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

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

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

+1

Ах, если бы там был значок читателя-разума! +1 –

+0

Ужасный код с точки зрения поддержки, но отлично отвечает на вопрос, поэтому +1. – arbiter

+0

Да, это очень зависит от значений в поле enum all being ''. Если вы не можете этого гарантировать, вам действительно нужна карта перевода. – Flynn1179

3

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

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]; 
} 
0

Вы пытались использовать оператор 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; 
     } 
+0

Это не сработает - MyVar - 1, 2 или 3, а значения перечисления - 11, 12 и 33. Требование пахнет , –

+0

Ах, хорошо. Спасибо что подметил это. Похоже, что отображение/разборка - это путь. –

0

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

myEnum blah = (myEnum)Enum.GetValues(typeof(myEnum)).GetValue(myVar - 1); 
1

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

[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 и все полномочия из двух. Для проверки нескольких значений, которые вы можете использовать:

 //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# требует явного приведения в целое, в отличие от C++). Побитовые операции сначала немного сложны, но с небольшой практикой вы должны понять это.