C# 测试多个标志值
我有一个标志枚举:C# 测试多个标志值,c#,enum-flags,C#,Enum Flags,我有一个标志枚举: public enum AssignmentType { None = 0, Attendant = 1, ConductorCBS = 2, ReaderCBS = 4, Chairman = 8, Mike = 16, PlatformAttendant = 32, Prayer = 64, OCLM = 128, Sound = 256, Student = 512, Cus
public enum AssignmentType
{
None = 0,
Attendant = 1,
ConductorCBS = 2,
ReaderCBS = 4,
Chairman = 8,
Mike = 16,
PlatformAttendant = 32,
Prayer = 64,
OCLM = 128,
Sound = 256,
Student = 512,
Custom = 1024,
Demonstration = 2048,
Assistant = 4096
}
我现在想测试我的变量是否符合某个标志条件
我想确定我的变量是仅是的任意组合:
None
学生
助手
演示
bool bIsPersonnel = true;
if (_Assignments == AssignmentType.None ||
_Assignments == AssignmentType.Demonstration ||
_Assignments == AssignmentType.Student ||
_Assignments == AssignmentType.Assistant ||
_Assignments == (AssignmentType.Demonstration | AssignmentType.Student))
{
bIsPersonnel = false;
}
但我很快意识到有多种选择
有没有更简单的方法
我看不出建议的答案有什么帮助。我想用相反的方式做测试是最容易的。只要测试一下它是否有任何其他标志,我就知道它是人员 (回答不正确)
更正答案:
var NonPersonnel = AssignmentType.None | AssignmentType.Student | AssignmentType.Assistant | Demonstration;
bool bIsPersonnel = (_Assignments | NonPersonnel) != NonPersonnel;
目前,我想到了做反向测试:
bool-bisphoperson=false;
if(_Assignments.HasFlag(AssignmentType.Attendant | AssignmentType.ConductorCBS|
AssignmentType.ReaderCBS | AssignmentType.Chairman|
AssignmentType.Mike | AssignmentType.PlatformAttendant|
AssignmentType.Prayer | AssignmentType.OCLM|
AssignmentType.Sound | AssignmentType.Custom)
{
BisPersonal=true;
}
这是最简单的,因为我们知道,如果设置了其中任何一个标志,那么此人就是“人员”。其他标志不在图中,我们不必测试多个标志配置。您可以使用
~
逐位求反运算符应用掩码来查找所有无效标志,并检查是否应用了任何标志
var valid = AssignmentType.Student | AssignmentType.Assistant | AssignmentType.Demonstration;
var invalid = ~valid; // Everything that isn't valid
if ((_Assignments & invalid) != 0)
{
// There was at least one invalid flag, handle it appropriately
}
或检查其是否有效:
if ((_Assignment & invalid) == 0)
{
// There are no invalid flags, handle it appropriately
}
或者,如果您刚刚设置了一个布尔标志,则根本不需要if
语句:
bool isPersonnel = ((assignment & invalid) != 0);
只需为要检查的值制作一个掩码,
和
带有该值的掩码,这就是检查标志的方式,而不考虑标志的数量
if (0 != _Assignments &
(AssignmentType.Demonstration | AssignmentType.Student | AssignmentType.Assistant))
无需检查AssignmentType.None
,因为它本身不是一个标志,只是一个等于0的保留值,用于检查是否未设置任何标志。如果组合同时包含“无标志”和“其他标志”,那么它就没有意义,对吗?如果确实需要检查“无标志”条件,则单独检查
if (_Assignments == AssignmentType.None || (0 != _Assignments &
(AssignmentType.Demonstration | AssignmentType.Student | AssignmentType.Assistant)))
这也是检查标志的方式
我认为这是意料之中的:
var flags =
AssignmentType.None
| AssignmentType.Student
| AssignmentType.Assistant
| AssignmentType.Demonstration;
bool bIsPersonnel =
!(_Assignments == AssignmentType.None
|| (flags & _Assignments) == _Assignments);
以下是一些示例输出:
_Assignments = AssignmentType.Demonstration | AssignmentType.Assistant; // False
_Assignments = AssignmentType.None; // False
_Assignments = AssignmentType.Demonstration | AssignmentType.Mike; // True
@mjwills的可能重复项是,如果设置为
None
,则不应设置其他标志。但是,这里有几种可能的配置。我只是想知道是否有一种更简单的方法来进行测试。稍微简单一点的方法是使用Enum.hasblag()。@meJustAndrew请查看我建议的答案。但这只是在设置了每个标志的情况下进行的测试。它忽略了其他标志也可能被设置的事实。对吗?@Andrew Truckle你是对的,我的回答不正确。我会试着想出一些其他的办法。看看我的答案,看看是否可以改进。谢谢,但是你还是忽略了其他标志可能被设置的要点。看看我自己的答案,也许能解释得更清楚。我不明白你所说的“可能设置其他标志”是什么意思?您正在检查变量是否启用了标志中的任何位,对吗?这一个正好做到了这一点,如果只设置了至少一个指定标志,则返回true。其他比特到底是如何联系在一起的呢?我们想看看它们是否只有规定的标志。因此,如果他们也有,比如说服务员
,那么他们就不满足条件。服务员
不在演示|学生|助手
中,所以如果服务员不在演示|学生|助手
中,显然条件是真的,人员
将是假的,抱歉!我很容易被旗帜弄糊涂。谢谢谢谢因此,这将等同于我在建议答案中所述内容的简化版本?您的代码在使用&
比较AssignmentType
和bool
时产生语法错误。我认为您需要检查AssignmentType。无
单独声明,因为如果\u Assignments==AssignmentType.None
则(\u Assignments&invalid!=0)
将为false(OP希望在这种情况下为true)。请更新您的答案,以便我将其粘贴到VC中时不会出现错误。谢谢@Andrewtrucle:用一对支架固定。现在应该可以了。这太低效了,\u Assignments.hassflag(AssignmentType.Attendant | AssignmentType.ConductorCBS | AssignmentType.ReaderCBS…)better@phuclv更新。@phuclv我还原了我的代码。我发现我必须满足上述所有标志才能使其为真,因为我希望其中任何一个标志都为真。您可以忽略AssignmentType。由于它为零,因此标志的赋值中没有一个
部分。
var flags =
AssignmentType.None
| AssignmentType.Student
| AssignmentType.Assistant
| AssignmentType.Demonstration;
bool bIsPersonnel =
!(_Assignments == AssignmentType.None
|| (flags & _Assignments) == _Assignments);
_Assignments = AssignmentType.Demonstration | AssignmentType.Assistant; // False
_Assignments = AssignmentType.None; // False
_Assignments = AssignmentType.Demonstration | AssignmentType.Mike; // True