Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试多个标志值_C#_Enum Flags - Fatal编程技术网

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