确定枚举中缺少哪些标志

时间:2013-08-19 20:59:49

标签: c# .net

假设我有下面的枚举:

[Flags]
public enum NotifyType
{

    None = 0,
    Window = 1 << 0,
    Sound = 1 << 1,
    Flash = 1 << 2,
    MobileSound = 1 << 3,
    MobilePush = 1 << 4
}

考虑两个枚举:

var myenums = Window | Sound | Flash;


//var possibleUpdate = Window | MobilePush;

void UpdateMyEnums(NotifyType possibleUpdate)
{
    //Does myenums contain all the flags in 'possibleUpdate'?  If not add
    //the missing flags to myenums

}

myenums相比,如何确定NotifyType.MobilePush变量不包含possibleUpdate值?我是否必须针对possibleUpdate测试myenums中的每个旗帜?

我在.NET 4.0上使用C#

4 个答案:

答案 0 :(得分:4)

在.NET 4+中你可以使用(当然人们会说它比手动操作慢10倍)你可以使用Enum.HasFlag,显然会否定结果。

答案 1 :(得分:4)

if (myenums & possibleUpdate != possibleUpdate)
    //not a possible update

要获取所需的标记,而不是myenums

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

答案 2 :(得分:4)

无需确定缺少哪一个,您只需在bit-wise ORmyenums之间执行possibleUpdate,然后重新分配值。

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

答案 3 :(得分:0)

显而易见的答案是简单地按位 - 或者需要的标志。如果你想要一系列缺失的标志,比如报告:

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

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

您可以使用Enum.HasFlag

稍微清理一下
var missing = Enum.GetValues(typeof(NotifyType)).Cast<NotifyType>()
                  .Where(nt => possibleUpdate.HasFlag(nt)
                            && !myenums.HasFlag(nt));