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

时间:2014-02-11 21:39:42

标签: 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.None,
    All = ItemType.All,
    Option1 = ItemType.Option1,
    Option2 = ItemType.Option3,
    Option3 = ItemType.Option3,
    Options2And3 = ItemType.Option2 | ItemType.Option3
}

检索数据:

var filteredResults = AllItems.Where(x => this.DisplayMode.HasFlag((DisplayModeEnum)x.AlertType));

这样,我可以指定像“Options2And3”这样的东西,或者我可以指定多个显示模式“Option1,Option2”,它将按预期工作。

但是,实际上,ItemType只是一个int,并且将具有序数值(1, 2, 3等)而不是1 << 00x0000001)。因此,[Flags]DisplayModeEnum无法正常使用上述方式。 (例如:如果我试图编码选择int 1和3的行为,结果是逻辑或者给我0x00000011,这可能意味着2,3或1和3,因此不可用)< / p>

问题:是否有一种优雅的编码方式,所以我可以像[Flags]那样选择多个选项,但所选的值是序数整数而不是二进制标志?

替代方案我考虑过

我考虑过这样做,但与在枚举上使用[Flags]属性相比,它似乎不够优雅。在字典中存储映射:

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

我不喜欢这个,这限制了我,所以我只能启用一个预设的DisplayMode,而不是能够动态创建一个新的。 (假设我想显示选项1和3,但DisplayModeEnum没有[Flags]所以我不能,所以如果我想显示一个自定义的选项组合,我必须为它创建一个新的DisplayModeEnum选项我想要的确切配置。

这也意味着我必须使用int ID编辑Dictionary而不是能够引用枚举。

0 个答案:

没有答案