我最近开始一个项目,我有一个问题。
假设我正在处理一个班级Person
,一个人可能会遇到一个(或多个)疾病。
所以我创建了一个枚举:
public enum diseases{headache,throat,bruise,gunshot,none}; // enum containing all the diseases
public diseases disease;
进一步在代码中我为该人设置了一个disease
,它运行正常。
事实上,在我的项目中可能有一点,一个人可能患有两种疾病。 所以有我的问题:
[System.Flags]
),所以当时间到来我可以检查包含两个不同值的disease
枚举。这是一个好方法吗?diseases
创建第二个属性(就像我创建disease
一样)并节省使用位标记的所有麻烦吗?提前感谢任何有关此事的亮点,无法确定这里最好的方法。
答案 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)
[System.Flags]
是一个很好的方法吗? - 是的,如果是一个小而扁平的列表,[System.Flags]
方法非常好且非常有效。N
次这样做。创建一个集合或位字段,除非系统本身仅限于两个项目(例如,二叉树),否则永远不会使用第二个属性。如果疾病列表不&#34;平坦&#34; (例如,您计划使用ViralThroat
,BacterialThroat
和ThroatInjury
代替您现在拥有的简单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。每种疾病都可以装饰这个类,这可能使未来与它的相互作用更容易维持。如果您需要变异疾病组合导致不同的结果,从长远来看这可能会更好。