使用 C# 枚举标志 Return 一组基于其按位或运算值的值
Using C# Enum Flags To Return A Set Of Values Based On Their Bit-Wise OR'ed Values
我了解到您可以通过这种方式配置 C# 枚举标志:
[Flags]
public enum MyEnum
{
Unknown = 0,
Type1 = 1,
Type2 = 2,
Type3 = 4,
Type4 = 8,
Type5 = 16
}
配置完成后,您可以像这样表示一组枚举:
MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2
然后你可以对这个集合进行检查,例如:
if(enumerationSet.HasFlag(MyEnum.Type1))
{
// Do something
}
或者像这样打印它们的值:
Console.WriteLine("{0}", enumerationSet);
这将打印:
Type1, Type2
但是,我可以倒序吗?例如,如果我知道
MyEnum.Type1 | MyEnum.Type2 == 3
然后我可以问 MyEnum
它的 value/types 的哪一组等于 3?然后,我可以创建一个扩展方法 (GetSet
) 来执行,如下所示:
List<MyEnum> myEnumSetList = MyEnum.GetSet(3)
返回一组 MyEnum
或一组值,即 {1, 2}
。
请指教
编辑:我终于弄明白了。在下面发布我的答案。
您可以将 Integer
转换为枚举并使用 & 比较。
例子
var num = 1;
var doesExist = (((enumerationSet) & ((MyEnum) num)) != 0);
然后如果它存在,你可以在你的扩展方法中return它。
完整代码
var enumList = new List<MyEnum>();
var testNumbers = new List<int>{ 1, 2, 4};
MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2;
foreach (var num in testNumbers)
{
var doesExist = (((enumerationSet) & ((MyEnum) num)) != 0);
if (doesExist)
enumList.Add((MyEnum)num);
}
enumList.ForEach(x => Console.WriteLine(x.ToString()));
return enumList;
您可以使用以下代码手动解析它:
var res = 3;
var myEnumSetList = res.ToString()
.Split(new[] { ", " }, StringSplitOptions.None)
.Select(v => (MyEnum)Enum.Parse(typeof(MyEnum), v)).ToList();
如果你想要一个标志列表,你可以使用这个:
var f = 1 + 4 + 8;
var s = Convert.ToString(f, 2);
var flags =
s.Where(w=> w !='0').Select(
(c, i) =>
(MyEnum)Enum.Parse(typeof(MyEnum),
(int.Parse(c.ToString())*Math.Pow(2, i)).ToString(CultureInfo.InvariantCulture)));
经过一些修改后,我能够根据相应集合的值解析枚举值列表或:
protected List<MyEnum> GetEnumSet(int flagNumber)
{
List<MyEnum> resultList= new List<MyEnum>();
foreach (MyEnum value in Enum.GetValues(typeof(MyEnum)))
{
if (((MyEnum)flagNumber).HasFlag(value))
{
resultList.Add(value);
}
}
return resultList;
}
这里,flagNumber
是各自列表或运算后的值,即 MyEnum.Type1 |我的枚举类型 2。因此,通过发送此方法 flagNumber
,我得到列表 { MyEnum.Type1, MyEnum.Type2 }
我了解到您可以通过这种方式配置 C# 枚举标志:
[Flags]
public enum MyEnum
{
Unknown = 0,
Type1 = 1,
Type2 = 2,
Type3 = 4,
Type4 = 8,
Type5 = 16
}
配置完成后,您可以像这样表示一组枚举:
MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2
然后你可以对这个集合进行检查,例如:
if(enumerationSet.HasFlag(MyEnum.Type1))
{
// Do something
}
或者像这样打印它们的值:
Console.WriteLine("{0}", enumerationSet);
这将打印:
Type1, Type2
但是,我可以倒序吗?例如,如果我知道
MyEnum.Type1 | MyEnum.Type2 == 3
然后我可以问 MyEnum
它的 value/types 的哪一组等于 3?然后,我可以创建一个扩展方法 (GetSet
) 来执行,如下所示:
List<MyEnum> myEnumSetList = MyEnum.GetSet(3)
返回一组 MyEnum
或一组值,即 {1, 2}
。
请指教
编辑:我终于弄明白了。在下面发布我的答案。
您可以将 Integer
转换为枚举并使用 & 比较。
例子
var num = 1;
var doesExist = (((enumerationSet) & ((MyEnum) num)) != 0);
然后如果它存在,你可以在你的扩展方法中return它。
完整代码
var enumList = new List<MyEnum>();
var testNumbers = new List<int>{ 1, 2, 4};
MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2;
foreach (var num in testNumbers)
{
var doesExist = (((enumerationSet) & ((MyEnum) num)) != 0);
if (doesExist)
enumList.Add((MyEnum)num);
}
enumList.ForEach(x => Console.WriteLine(x.ToString()));
return enumList;
您可以使用以下代码手动解析它:
var res = 3;
var myEnumSetList = res.ToString()
.Split(new[] { ", " }, StringSplitOptions.None)
.Select(v => (MyEnum)Enum.Parse(typeof(MyEnum), v)).ToList();
如果你想要一个标志列表,你可以使用这个:
var f = 1 + 4 + 8;
var s = Convert.ToString(f, 2);
var flags =
s.Where(w=> w !='0').Select(
(c, i) =>
(MyEnum)Enum.Parse(typeof(MyEnum),
(int.Parse(c.ToString())*Math.Pow(2, i)).ToString(CultureInfo.InvariantCulture)));
经过一些修改后,我能够根据相应集合的值解析枚举值列表或:
protected List<MyEnum> GetEnumSet(int flagNumber)
{
List<MyEnum> resultList= new List<MyEnum>();
foreach (MyEnum value in Enum.GetValues(typeof(MyEnum)))
{
if (((MyEnum)flagNumber).HasFlag(value))
{
resultList.Add(value);
}
}
return resultList;
}
这里,flagNumber
是各自列表或运算后的值,即 MyEnum.Type1 |我的枚举类型 2。因此,通过发送此方法 flagNumber
,我得到列表 { MyEnum.Type1, MyEnum.Type2 }