C# 确定枚举中缺少哪些标志

C# 确定枚举中缺少哪些标志,c#,.net,C#,.net,假设我有下面的枚举: [Flags] public enum NotifyType { None = 0, Window = 1 << 0, Sound = 1 << 1, Flash = 1 << 2, MobileSound = 1 << 3, MobilePush = 1 << 4 } 与possibleUpdate相比,如何确定myenums变量不包含NotifyType.Mo

假设我有下面的枚举:

[Flags]
public enum NotifyType
{

    None = 0,
    Window = 1 << 0,
    Sound = 1 << 1,
    Flash = 1 << 2,
    MobileSound = 1 << 3,
    MobilePush = 1 << 4
}
possibleUpdate
相比,如何确定
myenums
变量不包含
NotifyType.MobilePush
值?我是否必须在
possibleUpdate
中对照
myenum
测试每个标志

我正在使用.NET4.0上的C#

在.NET4+中,你可以使用(当然,人们会抱怨它比手动操作慢10倍),这显然否定了结果

if (myenums & possibleUpdate != possibleUpdate)
    //not a possible update
要获取myenums中不需要的标志,请执行以下操作:

NotifyType missing = (~(myenums ^ wanted) ^ wanted) & (myenums | wanted);

无需找出缺少的是哪一个,只需在
myenum
possibleUpdate
之间执行
逐位或
,然后将值赋回

//Does myenums contain all the flags in 'possibleUpdate'?  
if (myenums & possibleUpdate != possibleUpdate)
    //If not add the missing flags to myenums
    myenums = myenums | possibleUpdate;

显而易见的答案是简单地按位或按需标记。如果您想要一系列缺少的标志,例如报告:

var missing = Enum.GetValues(typeof(NotifyType)).Cast<NotifyType>()
                  .Where(nt => ((nt & possibleUpdate) == nt)
                            && ((nt & myenums) == 0));

Console.WriteLine("Missing: {0}", String.Join(" | ", missing));

你可以用|=,但他不是在找那个。@sNotALie。他正在谈论添加丢失的旗帜,这正是他所需要的。不需要找出丢失的是哪一个。他不想添加丢失的标志,他想得到丢失的标志。@It'sNotALie。代码注释说“如果不将缺少的标志添加到myenums”,这正是代码所做的。@joel在进一步检查中说得对,但在对我的回答的注释中,他指定他也需要缺少的标志。是的,我很抱歉@It'sNotALie,我早期的注释让人困惑。好的一面是,你回答了我的下一个问题!所以我投了赞成票表示感谢。@Mike_G确实明白这绝对是可怕的:P
var missing = Enum.GetValues(typeof(NotifyType)).Cast<NotifyType>()
                  .Where(nt => ((nt & possibleUpdate) == nt)
                            && ((nt & myenums) == 0));

Console.WriteLine("Missing: {0}", String.Join(" | ", missing));
var missing = Enum.GetValues(typeof(NotifyType)).Cast<NotifyType>()
                  .Where(nt => possibleUpdate.HasFlag(nt)
                            && !myenums.HasFlag(nt));