Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 允许选择多个映射到int而不是二进制标志的选项_C#_Collections_Enums - Fatal编程技术网

C# 允许选择多个映射到int而不是二进制标志的选项

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

我想为控件创建一个DisplayMode,用于过滤显示在其中的数据。传入控件的类型来自数据库,并且具有用于筛选列表的ID

我想做的是:

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));