2010-07-19 59 views
1

我有一个枚举,看起来像这样:一次检查3个枚举值?

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

在我的代码,我需要说FIELD1是1,场2是2场3根据可变我已经是3。这个变量是1或2或3;这是一个整数。我可以写在一行吗?像下面,但较短的...

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

感谢:-)

+3

目前尚不清楚你的意思。 'field1'将*总是*的值为11,那么你的第一句话真的意味着什么?同样,在你使用'field1'的第二段代码片段中,却没有说明你在做什么。 – 2010-07-19 13:38:01

+0

我将它传递给一个方法,它需要有11个而不是1个例子。我修改了我的帖子... – grady 2010-07-19 13:41:58

+0

看起来如果你将'myVar'传递给'SomeMethod',并在那里建立一个switch case以处理'myVar'的不同值,会更好。 – 2010-07-19 13:50:01

回答

1

似乎是一个switch语句会比好很多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); 

编辑:试想想起来了,你可能想以防万一来包装这个在​​有ISN在给出的myVar的枚举值中,除非可以保证永远不会发生这种情况。

另一个编辑:仔细想想,如果有只是三个值,你可能只是做:

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

然而,这种治疗不是1或者2,如果它是3的任何值,但如果这是保证,这应该不成问题。

+1

啊,如果只有一个心灵读者徽章! +1 – 2010-07-19 13:40:42

+0

可支持性方面的糟糕代码,但完全回答了这个问题,所以+1。 – arbiter 2010-07-19 13:43:03

+0

是的,它非常依赖enum中所有值为'字段'的值。如果你不能保证,你真的需要一个翻译地图。 – Flynn1179 2010-07-19 13:49:00

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来抵抗该值?试试这个代码,它假设你在问题中声明的枚举类型。在switch语句中将myVar转换为myEnum类型,并将“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.需求有异味。 – 2010-07-19 13:51:14

+0

啊,好的。感谢您指出了这一点。看起来像映射/解析是当时的方式。 – 2010-07-19 13:56:14

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 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++)。按位操作起初有点棘手,但通过一些练习,你应该能够弄明白。