【问题标题】:How to add multiple Enums to List object如何将多个枚举添加到列表对象
【发布时间】:2014-02-06 21:47:48
【问题描述】:

我有一个像下面这样的枚举:

public enum MyCategory
{
    Automotive = 1,
    BeautySalon = 2,
    EventsEntertainment = 3,
    and so on...
}

在我的主类中,我有一个这样的属性:

public List<MyCategory> Categories { get; set; }

我的业务实体可以随时与其中的一个或多个相关联。我可以在 UI 中显示此枚举列表,但我的问题是,将多个这些枚举存储在这样的 List 中是否是一种好习惯,如果是这样,解决此问题的最佳方法是什么?

【问题讨论】:

  • 我想我更愿意将其设为标志枚举并组合这些值。

标签: c# enums


【解决方案1】:

您应该利用FlagsAttribute

[Flags]
public enum MyCategory
{
    Automotive = 1,
    BeautySalon = 2,
    EventsEntertainment = 4,
    and so on... (each next item should have a value that it 2^n)
}

然后:

MyCategory myCategory = MyCategory.Automotive ;
myCategory |= MyCategory.BeautySalon ;

或者如果您想一次分配多个枚举值:

MyCategory myCategory = (MyCategory.Automotive|MyCategory.BeautySalon); 

然后我建议使用以下辅助方法进行检查:

public static bool ContainsMyCategory(MyCategory val, MyCategory checkedAgainst)
{
  return ((val & checkedAgainst)==checkedAgainst);
}

【讨论】:

  • 你还需要使用二的幂。
  • 如果您使用左移,这会特别酷! None = 0, Automotive = 1, BeautySalon = 1 &lt;&lt; 1, EventsEntertainment = 1 &lt;&lt; 2
  • 谢谢,我是新手,但这很有帮助!
【解决方案2】:

更优选的方法是使用[Flags] 样式的解决方案。本质上,枚举中的每个值都有一个不同的位,设置或不设置该位表示该值是否存在。

[Flags]
public enum MyCategory
{
    Automotive = 0x1;
    BeautySalon = 0x2;
    EventsEntertainment = 0x4,
    and so on...
}

Categories 属性将具有 MyCategory 类型,您将使用按位运算来检查值

if (0 != (obj.Categories & MyCategory.Automotive)) {  
  // The automotive category is set 
  ...
}

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多