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!