是否有方法优化下列代码:
enum ObjType
{
A,
B,
C,
D,
E,
F,
G,
H
}
...
if (instance.ObjType == ObjType.B
|| instance.ObjType == ObjType.D
|| instance.ObjType == ObjType.E
|| instance.ObjType == ObjType.F
|| instance.ObjType == ObjType.G
|| instance.ObjType == ObjType.H)
doSmth();以下解决方案不适合我:
if (instance.ObjType >= ObjType.B)
doSmth();因为不同的情况需要对不同的ObjType组合进行大量的比较。
发布于 2015-03-25 13:26:00
您可以将枚举定义为标志枚举。
[Flags]
enum ObjType
{
None = 0,
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3,
E = 1 << 4,
F = 1 << 5,
G = 1 << 6,
H = 1 << 7,
MyCombination1 = A | B | D,
MyCombination2 = C | F | G | H
}像这样,您可以定义多达32个值(加上None = 0和任意数量的其他值组合),也可以定义多达64个值
[Flags]
enum ObjType : long
{
None = 0,
A = 1L << 0,
B = 1L << 1,
...
}现在你可以比较
if (instance.ObjType & ObjType.MyCombination1 != ObjType.None) {
...
}如果枚举本身更适合您的需要,也可以在枚举之外定义常量。
private const ObjType AdHocCombination = ObjType.A | ObjType.C | ObjType.H;在定义标志时,值必须具有2的幂(None除外)。这很容易通过使用左移位操作符<<来实现。
发布于 2015-03-25 13:17:13
如果手动分配这些值,如下所示
enum ObjType
{
A = 1,
B = 2,
C = 3,
...
H = 8
}您将能够使用数字比较。
同样,如果使用枚举标志,则可以使用位掩蔽:
[Flags]
enum ObjType
{
A = 1,
B = 2,
C = 4,
...
H = 256
}
if (((ObjType.A | ObjType.B | ObjType.C) & val) != 0) {
...
}发布于 2015-03-25 13:15:40
一般来说,您的代码没有任何问题。这是惯用的C#。
如果您所说的“优化”指的是“消除所有冗余”,我建议如下:
var relevantTypes = new[] { ObjType.B, ObjType.D, ObjType.E, ... };
if (relevantTypes.Contains(instance.ObjType))
doSmth();局部变量只是一个例子,我个人认为它是一个private static readonly字段(因为您不能拥有一个const数组)。
如果您明智地选择名称,这也会使您的代码自文档化:
if (FooableTypes.Contains(instance.ObjType))
doSmth();
if (TypesComparableToBar.Contains(instance.ObjType))
doSmthElse();https://stackoverflow.com/questions/29256645
复制相似问题