枚举值中包含的位掩码标志的最佳方法是什么?
What is the best way to enumerate bitmask Flags contained within a value?
我正在使用一个旧的(>15 年)系统,该系统使用 char[] 数组存储属性,如果索引具有 "X",则该属性被激活。我做了这么多来转换它:
...
[Flags]
public enum PDMObjectFlags {
None = 0, // 000000
OptionA = 1, // 000001
OptionB = 2, // 000010
OptionC = 4, // 000100
OptionD = 8, // 001000
OptionE = 16, // 010000
OptionF = 32 // 100000
}
...
string userOptionsStr = " XXX"; // " XXX"
string userOptionsBin = userOptions
.Replace('X', '1')
.Replace(' ', '0'); // "000111"
int userOptionsInt =
Convert.ToInt32(userOptionsBin, 2); // 7
我如何最终得到允许我显示特定用户的所有属性的东西?像这样:
foreach (var x in userOptionsList){
Console.Write("John's account has " + x);
}
// Output:
//
// John's account has OptionA
// John's account has OptionB
// John's account has OptionC
抱歉,如果这个例子很蠢,我只是在这里打出来的。它最终将与模型一起传递到 Razor 视图并在页面上迭代。
谢谢!
将其作为整数后,您可以转换回枚举并使用 ToString()
提取名称列表。
给定的枚举定义为(编译):
[Flags]
public enum PDMObjectFlags {
None = 0, // 000000
A = 1, // 000001
B = 2, // 000010
C = 4, // 000100
D = 8, // 001000
E = 16, // 010000
F = 32 // 100000
}
您可以使用以下方法扩展您的代码:
PDMObjectFlags flags = (PDMObjectFlags)userOptionsInt;
var names = flags.ToString().Split(new[] {',',' '}, StringSplitOptions.RemoveEmptyEntries);
foreach(var name in names)
Console.WriteLine("John\'s account has Option {0}", name);
这将打印您指定的输出,即:
John's account has Option A
John's account has Option B
John's account has Option C
我正在使用一个旧的(>15 年)系统,该系统使用 char[] 数组存储属性,如果索引具有 "X",则该属性被激活。我做了这么多来转换它:
...
[Flags]
public enum PDMObjectFlags {
None = 0, // 000000
OptionA = 1, // 000001
OptionB = 2, // 000010
OptionC = 4, // 000100
OptionD = 8, // 001000
OptionE = 16, // 010000
OptionF = 32 // 100000
}
...
string userOptionsStr = " XXX"; // " XXX"
string userOptionsBin = userOptions
.Replace('X', '1')
.Replace(' ', '0'); // "000111"
int userOptionsInt =
Convert.ToInt32(userOptionsBin, 2); // 7
我如何最终得到允许我显示特定用户的所有属性的东西?像这样:
foreach (var x in userOptionsList){
Console.Write("John's account has " + x);
}
// Output:
//
// John's account has OptionA
// John's account has OptionB
// John's account has OptionC
抱歉,如果这个例子很蠢,我只是在这里打出来的。它最终将与模型一起传递到 Razor 视图并在页面上迭代。
谢谢!
将其作为整数后,您可以转换回枚举并使用 ToString()
提取名称列表。
给定的枚举定义为(编译):
[Flags]
public enum PDMObjectFlags {
None = 0, // 000000
A = 1, // 000001
B = 2, // 000010
C = 4, // 000100
D = 8, // 001000
E = 16, // 010000
F = 32 // 100000
}
您可以使用以下方法扩展您的代码:
PDMObjectFlags flags = (PDMObjectFlags)userOptionsInt;
var names = flags.ToString().Split(new[] {',',' '}, StringSplitOptions.RemoveEmptyEntries);
foreach(var name in names)
Console.WriteLine("John\'s account has Option {0}", name);
这将打印您指定的输出,即:
John's account has Option A
John's account has Option B
John's account has Option C