C# 允许选择多个映射到int而不是二进制标志的选项
我想为控件创建一个DisplayMode,用于过滤显示在其中的数据。传入控件的类型来自数据库,并且具有用于筛选列表的ID 我想做的是:C# 允许选择多个映射到int而不是二进制标志的选项,c#,collections,enums,C#,Collections,Enums,我想为控件创建一个DisplayMode,用于过滤显示在其中的数据。传入控件的类型来自数据库,并且具有用于筛选列表的ID 我想做的是: enum ItemType { None = 0, All = ~0, Option1 = 1 << 0, Option2 = 1 << 1, Option3 = 1 << 2, } [Flags] enum DisplayModeEnum { None = ItemType
enum ItemType
{
None = 0,
All = ~0,
Option1 = 1 << 0,
Option2 = 1 << 1,
Option3 = 1 << 2,
}
[Flags]
enum DisplayModeEnum
{
None = ItemType.None,
All = ItemType.All,
Option1 = ItemType.Option1,
Option2 = ItemType.Option3,
Option3 = ItemType.Option3,
Options2And3 = ItemType.Option2 | ItemType.Option3
}
通过这种方式,我可以指定选项2和3,或者我可以指定多个显示模式选项1、选项2,它将按预期工作
然而,在现实中,ItemType只是一个int,它的序数值是1、2、3等等,而不是1。我看不出你提到的ItemType问题只是一个int,它的序数值是1、2、3等等,而不是1个坏例子。例如,如果我想要选项1和3,那将是0x00000001和0x00000011。如果您或您将这两个选项重新设置为0x00000011,您将无法判断是否选择了选项1和3,或者仅选择了3。在我看来,具有Flags属性的枚举,其中每个值设置的位由原始序列整数列表中的对应值确定。然后可以编写方法在每个方向进行转换。
var filteredResults = AllItems.Where(x => this.DisplayMode.HasFlag((DisplayModeEnum)x.AlertType));
enum DisplayModeEnum
{
None,
All,
Option1,
Option2,
Option3,
Options2And3,
}
var mapping = new Dictionary<DisplayModeEnum, List<int>>(){
{DisplayMode.None, null},
{DisplayMode.All, new List<int>() {1,2,3,4,5,6}},
{DisplayMode.Option1, new List<int>() {1}},
{DisplayMode.Options2And3, new List<int>() {2,3}},
};
var filteredResults = AllItems.Where(x => mapping[this.DisplayMode].Contains(x.ItemTypeID));