C# 多项选择枚举

C# 多项选择枚举,c#,enums,C#,Enums,我最近开始一个项目,我有一个问题 假设我正在与一个班级的人打交道,一个人可能会遇到一种(或多种)疾病。 因此,我创建了一个枚举: public enum diseases{headache,throat,bruise,gunshot,none}; // enum containing all the diseases public diseases disease; 在代码中,我给那个人设置了一种疾病,效果很好 问题是,在我的项目中,可能有一个人有两种疾病。 所以我的问题是: 在这里使用

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

假设我正在与一个班级的人打交道,一个人可能会遇到一种(或多种)疾病。 因此,我创建了一个枚举:

 public enum diseases{headache,throat,bruise,gunshot,none}; // enum containing all the diseases
 public diseases disease; 
在代码中,我给那个人设置了一种疾病,效果很好

问题是,在我的项目中,可能有一个人有两种疾病。 所以我的问题是:

  • 在这里使用enum是最好的选择吗?我希望我的代码被组织和理解,这是使用枚举的主要原因
  • 如果使用enum是一个不错的选择,那么我已经成功地将此enum与位标志(使用
    [System.flags]
    )结合起来,这样当时间到来时,我可以检查包含两个不同于enum值的
    疾病。这是一个好方法吗
  • 如果使用enum是一个不错的选择,我是否应该从
    diseases
    (就像我创建的
    disease
    )创建第二个属性,并避免使用位标志带来的所有麻烦

  • 提前感谢您对这一问题的介绍,我想不出最好的方法是什么。

    使用枚举上的FlagsAttribute

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

    这应该给你你所需要的。

    这里有很多意见需要征求,正确的答案是,在任何给定的情况下,什么样的解决方案是正确的取决于很多变量。只要为枚举指定了
    [Flags]
    属性,就可以使用枚举来表示多个值。请记住,如果您决定采用该方法,那么您将负责指定枚举特定的非重叠值的值,如1、2、4、8、16、32等。

    枚举是表示一种疾病的合理(但有点简单化)方法

    如果某人可能患有N种疾病,那么只需使用该类型对象的容器,如列表。但是您需要选择正确的容器。疾病列表可能是,例如:
    {头痛,喉咙,头痛,喉咙,枪伤}
    。列表允许重复。你真正需要的是一套疾病。集合是一种不允许重复的结构


    选择如何表示一种疾病和一个人可能有N种疾病这两个事实是两个完全独立的事实,因此你需要一个人有一个疾病容器。

    一个好的选择是为一个人列出一个
    列表

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

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

  • 使用枚举是这里的最佳选择吗?-这取决于你想覆盖多少疾病。如果这个数字很小(10..20),并且列表是平坦的(没有疾病的层次),那么你就没事了。否则,考虑一些替代方案。
  • [System.Flags]
    是一个好方法吗是的,如果是一个小的、扁平的列表
    [System.Flags]
    方法非常好而且非常有效
  • 我是否应该从疾病中创建第二个属性并避免使用位标志带来的所有麻烦?用第二个属性代替运行集合是一个糟糕的想法。如果你必须做一件事两次,很可能你会做
    N
    次。创建一个集合或位字段,除非系统本身被限制为两个项目(例如,二叉树),否则永远不要使用第二个属性

  • 如果疾病列表不是“平坦的”(例如,你计划用
    病毒性喉疾病
    细菌性喉疾病
    ,和
    咽喉疾病
    代替你现在拥有的简单的
    喉疾病
    ),你最好将疾病建模为类,并创建一个附属于
    人的疾病集合。您可以添加用于检查特定疾病集合的方法,这对于搜索来说可能是明智的:例如,当将
    咽喉
    作为搜索标准传递时,可以查找任何类型的咽喉子疾病。

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

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

    但这也有它的缺点。它不容易扩展。我建议您使用。每一种疾病都可以装饰班级,使未来与班级的互动更容易维持。如果你需要方差-疾病组合导致不同的结果,从长远来看,这可能更好。

    使用
    列表
    或者?我确实设法使用了标志,在我的项目的其余部分使用位标志听起来有点棘手。为什么列表在这里会是一个好的选择?使用
    enum
    的一个问题就是它。因此,如果您使用枚举的位屏蔽功能来表示多种疾病,那么您的设计最多只能处理64种疾病。假设N在任何情况下都不会大于5,那么哪种方法最适合?您是否可以给出一个使用容器的示例?非常感谢@Oranges看到本教程:。为什么要使用哈希集而不是列表?以前从没听说过。谢谢@橙色、哈希集比列表查找单个项目更快。这是因为您比较的是每个元素的散列,而不是整个元素。非常感谢你的评论。我以前从未真正研究过枚举,所以:您实际上创建了一个列表,它的泛型类型是枚举?您可以创建任何类型的列表。不管它是类、结构、枚举还是接口。列表没有通用参数限制。
    public class Diseases
    {
    public bool Headache {get;set;}
    ...
    public bool HasAnyDisease() { return Headache || Throat || ...;}
    }