C# 用于生成linq anyFlags(MyFlag)的标志和枚举

C# 用于生成linq anyFlags(MyFlag)的标志和枚举,c#,C#,这是我知道的一个基本问题,肯定是对地球上和地球以外的每个人所做的一些老食谱的重做,但我只是迷失了方向,需要一些外部建议 我有这样一个枚举: [Flags] public enum MyEnum { none=0, //0000 toto=1, //0001 tata=2, //0010 tati=4, //0100 titi=8 //1000 } public static

这是我知道的一个基本问题,肯定是对地球上和地球以外的每个人所做的一些老食谱的重做,但我只是迷失了方向,需要一些外部建议

我有这样一个枚举:

[Flags]
    public enum MyEnum
    { 
        none=0,  //0000
        toto=1,  //0001
        tata=2,  //0010
        tati=4,  //0100
        titi=8   //1000
    }
 public static bool HasAnyFlags(this short input, Enum matchTo)
        {
            return ....????....;
        }
我有一个枚举值,类似于:

MyEnum s= tata | titi; //(1010) 
从我的理解来看,s=10

现在我的数据库中有一个值,它是一个短值,可能是以下值之一,即:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

id     EnumValue
1      3
2      14
3      10
4      9
5      0
现在我需要一个linq语句来说明哪个id至少有一个在s中给出的其他枚举

最后我需要:1,2,3,4

我这样做是为了这些方法:

public static bool HasAllFlags(this short input, Enum matchTo)
{
    return (Convert.ToUInt32(input) & Convert.ToUInt32(matchTo)) == Convert.ToUInt32(matchTo);
}

public static bool IsFlag(this short input, Enum matchTo)
{
    return Convert.ToUInt32(input)== Convert.ToUInt32(matchTo);
}
但我坚持这一点:

[Flags]
    public enum MyEnum
    { 
        none=0,  //0000
        toto=1,  //0001
        tata=2,  //0010
        tati=4,  //0100
        titi=8   //1000
    }
 public static bool HasAnyFlags(this short input, Enum matchTo)
        {
            return ....????....;
        }
他们工作得很好,但我现在需要这个方法,它会给我1,2,3,4作为期望的结果。我试过很多东西,但都做不好。你们中有人为此准备好了解决方案吗

提前感谢,


PS:我正在使用c#3.5

(Enum)0
进行比较怎么样?

考虑一下您的
HasAllFlags方法。它对测试值和所需值执行位与运算。其结果将是一个值,其中每个位设置为当且仅当其在测试值中设置且为所需值时。通过将此结果值与所有必需的标志集进行比较,可以得到答案

但是,此相同的结果值也可用于检查是否存在任何必需的标志。如果存在任何必需的标志,则此结果值将为非零。所以我们只需要

public static bool HasAnyFlags(this short input, Enum matchTo)
{
    return (Convert.ToUInt32(input) & Convert.ToUInt32(matchTo)) 
             != Convert.ToUInt32(0);
}
(请注意,
matchTo
0
的行为可能不是您所期望的)

示例(二进制):


对不起,我没有得到你的答案。您的意思是返回(枚举)0?您只想查看枚举是否设置了任何标志,对吗?如果没有,枚举值将为0。这不起作用。如果输入中有一个未在matchTo中给出的标志,则AND的值也将不为零。@Bryan不太同意你的观点,你能举个例子吗?谢谢你的解释,AakashM!