我有一个枚举,看起来像这样:一次检查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个枚举值?
enum myEnum
{
field1 = 11,
field2 = 12,
field3 = 33
};
在我的代码,我需要说FIELD1是1,场2是2场3根据可变我已经是3。这个变量是1或2或3;这是一个整数。我可以写在一行吗?像下面,但较短的...
if(myVar == 1)
SomeMethod(myEnum.field1)
...
感谢:-)
似乎是一个switch语句会比好很多ifs。
switch (myVar)
{
case 1:
// do stuff
break;
case 2:
// do stuff
break;
case 3:
// do stuff
break;
}
(myEnum) Enum.Parse(typeof(myEnum), "field" + myVar);
编辑:试想想起来了,你可能想以防万一来包装这个在有ISN在给出的myVar
的枚举值中,除非可以保证永远不会发生这种情况。
另一个编辑:仔细想想,如果有只是三个值,你可能只是做:
myVar == 1 ? myEnum.field1 : myVar == 2 ? myEnum.field2 : myEnum.field3;
然而,这种治疗不是1或者2,如果它是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];
}
您是否尝试过使用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;
}
这将不起作用 - MyVar是1,2或3,枚举值是11,12和33.需求有异味。 – 2010-07-19 13:51:14
啊,好的。感谢您指出了这一点。看起来像映射/解析是当时的方式。 – 2010-07-19 13:56:14
另一种方法(牢记枚举是由它的值时,您使用的GetValues排序):
myEnum blah = (myEnum)Enum.GetValues(typeof(myEnum)).GetValue(myVar - 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++)。按位操作起初有点棘手,但通过一些练习,你应该能够弄明白。
目前尚不清楚你的意思。 'field1'将*总是*的值为11,那么你的第一句话真的意味着什么?同样,在你使用'field1'的第二段代码片段中,却没有说明你在做什么。 – 2010-07-19 13:38:01
我将它传递给一个方法,它需要有11个而不是1个例子。我修改了我的帖子... – grady 2010-07-19 13:41:58
看起来如果你将'myVar'传递给'SomeMethod',并在那里建立一个switch case以处理'myVar'的不同值,会更好。 – 2010-07-19 13:50:01