在C#中(使用Unity在游戏中工作),我有一个带有[Flag]属性的枚举。我已经实例化了两次。我想要一种比较两个枚举的方法。具体来说,如果枚举A(将具有多个标志)包含来自枚举B(仅将被分配一个标志)的标志。
我不是试图将单个实例化的枚举与单个标志进行比较(已被多次回答)。
我怀疑可以通过使用GetValue转储值并在foreach循环中比较这些值来做到这一点,但是似乎应该有一种更直接的比较方法。
Town<-c("WATSONIA","NORTH MELBOURNE","MOONEE PONDS")
Latitude<-c("-37.71610","-37.80040","-37.76010")
Longitude<-c("145.0804","144.9544","144.9228")
pop<-c(1232131,213312,342344)
dt<-data.frame(Town,Latitude,Longitude,pop)
map <- ggplot() + geom_polygon(data = Vic, aes(x = long, y = lat, group = group), colour = "black", fill = pop)
map
我希望上面的代码检查电阻是否包含来自bilityType的标志。在上面的示例中,有问题的攻击将传入它的能力类型。如果该类型是水或刺穿,则应打印抵抗声明。如果是其他类型,则应该照常造成伤害。
答案 0 :(得分:2)
这是您需要的:
if ((resistances & abilityType) != 0)
{
print("You are resistance to this damage type");
}
...
答案 1 :(得分:2)
正如注释和其他答案所述,您要滥用的是按位&
运算符,因为枚举基于int
类型的(by default)进行比较。但是,自.NET 4.0开始,添加了Enum.HasFlag
扩展方法,可以做到这一点并提高了可读性。
// These two are semantically equal
if (resistance.HasFlag(abilityType))
{
print("You are resistance to this damage type");
}
if ((resistance & abilityType) != 0)
{
print("You are resistance to this damage type");
}
其背后是许多其他人的解释。可以亲自推荐Alan Zucconi's Enum, Flags and bitwise operators
简短的版本是按位AND(&
)运算符给出两个值“匹配”的结果,即它们都处于活动状态,一点一点地被激活。考虑它的一种方法是选择过滤器。要检查未知标志集的值A
是否包含特定标志B
,请使用过滤器,该过滤器仅允许标志B
通过,并检查是否通过了检查,检查是否通过了检查表示为零以外的任何值。过滤器与您要查找的标志完全相同。因此,表达式变为(A & B) != 0
。由于!=
的优先级高于&
,因此括号会强制覆盖操作的顺序。