多选枚举

时间:2014-08-25 15:07:39

标签: c# enums

我最近开始一个项目,我有一个问题。

假设我正在处理一个班级Person,一个人可能会遇到一个(或多个)疾病。 所以我创建了一个枚举:

 public enum diseases{headache,throat,bruise,gunshot,none}; // enum containing all the diseases
 public diseases disease; 

进一步在代码中我为该人设置了一个disease,它运行正常。

事实上,在我的项目中可能有一点,一个人可能患有两种疾病。 所以有我的问题:

  1. 在这里使用枚举是最好的选择吗?我希望我的代码能够被组织和理解,这是使用枚举的主要原因。
  2. 如果使用枚举是一个不错的选择,我已设法将此枚举与位标志结合使用(使用[System.Flags]),所以当时间到来我可以检查包含两个不同值的disease枚举。这是一个好方法吗?
  3. 如果使用enum是一个不错的选择,我应该从diseases创建第二个属性(就像我创建disease一样)并节省使用位标记的所有麻烦吗?
  4. 提前感谢任何有关此事的亮点,无法确定这里最好的方法。

7 个答案:

答案 0 :(得分:3)

一个好的选择是让List<diseases>为一个人持有。

public class Person
{
    public string Name { get; set; }
    public List<diseases> Diseases { get; set; }

    public Person(string name)
    {
        this.Name = name;
        Diseases = new List<diseases>();
    }
}

通过这种方式,您可以相对轻松地枚举所有值,而无需担心标记。

例如:

var bob = new Person("bob");
bob.Diseases.Add(diseases.gunshot);

var hasHeadache = bob.Diseases.Any(x => x == diseases.headache);

答案 1 :(得分:2)

枚举是一种似乎合理的(但有点简单)的方式来表示一种疾病。

如果有人患有N种疾病,那么只需使用该类型的容器对象,例如列表。但您需要选择合适的容器。疾病列表可以是,例如:{ headache, throat, headache, throat, gunshot }。列表允许重复。你可能真正需要的是一种的疾病。集合是一种不允许重复的结构。

选择你如何代表一种疾病以及一个人可能患有N种疾病的事实,以便你需要一个人拥有一个容器的疾病,这是两个完全独立的事实。

答案 2 :(得分:1)

这里有很多意见要求,正确的答案是,在任何特定情况下,它取决于许多变量是什么解决方案。只要将[Flags]属性赋予ENUM,就可以使用ENUM表示多个值。请记住,如果您决定走这条路线,那么您有责任分配ENUM特定非重叠值的值,如1,2,4,8,16,32等。

答案 3 :(得分:1)

  1. 在这里使用枚举是最佳选择吗? - 这取决于您想要涵盖的疾病数量。如果数量很小(10..20)并且列表是平的(没有疾病等级)那么你没事。否则,请考虑一些替代方案。
  2. [System.Flags]是一个很好的方法吗? - 是的,如果是一个小而扁平的列表,[System.Flags]方法非常好且非常有效。
  3. 我是否应该从疾病中创建第二个属性并省去使用位标记的所有麻烦?使用第二个属性来代替运行集合是一个糟糕的主意。如果你必须做两次事情,那么你可能会N次这样做。创建一个集合或位字段,除非系统本身仅限于两个项目(例如,二叉树),否则永远不会使用第二个属性。
  4. 如果疾病列表&#34;平坦&#34; (例如,您计划使用ViralThroatBacterialThroatThroatInjury代替您现在拥有的简单throat,您最好将疾病建模为类,以及创建一个附加到Person的疾病集合。您可以添加检查特定疾病的集合的方法,这可能是搜索的明智之处:例如,当throat作为搜索条件传递时,找到任何类型的喉咙亚病。

答案 4 :(得分:0)

在枚举上使用FlagsAttribute。

[Flags]
Public enum diseases 
{
    // your values here
}

这应该可以满足您的需求。

答案 5 :(得分:0)

枚举只是众多完全可以接受的选项之一。其他包括OO解决方案,如基础/派生类,或简单的字符串列表(或枚举的事件列表,为什么不?!)。通常最简单的方法是最好的。我们必须更多地了解你的问题才能推荐一个而不是另一个。

答案 6 :(得分:0)

虽然使用Flags是一种解决方案,但在这种情况下我不建议使用它。标志对于它们的用途并不详细。每当我使用标志时,我都需要重新学习如何在需要修改代码时正确使用标志。一个简单的替代方案是为每种可能的疾病创造一种属性......

public class Diseases
{
public bool Headache {get;set;}
...
public bool HasAnyDisease() { return Headache || Throat || ...;}
}

但这也有缺点。它不容易扩展。我建议使用Decorator Pattern。每种疾病都可以装饰这个类,这可能使未来与它的相互作用更容易维持。如果您需要变异疾病组合导致不同的结果,从长远来看这可能会更好。