我为这个奇怪的标题表示歉意,我不确定如何问这个问题,因此,如果您对哪个更合适有任何建议,请告诉我,我会进行更新。
通常在编程时,我会使用Enums作为字典的键,其值是与枚举有关的数据。通常,在意识到与该枚举关联的数据很多之前,我会先这样做,然后再引导我创建数据类型。
例如,我可能有枚举:
public enum AreaKey
{
Home,
Hospital,
Park,
TrainStation
}
然后是字典(Vector2是具有2个整数的类):
Dictionary<AreaKey, Vector2> areaCoordinatesByAreaKey;
稍后,我决定我想要一堆与此区域相关的其他数据,所以我建立了一个新类:
public class Area
{
Vector2 coordinates;
string name;
// more data
}
现在,要引用此数据,我知道我可以使用与检索指定区域的键相同的枚举来构建字典,但这对我来说总是很麻烦,几乎就像是不合适的OOP。
我有区域对象。他们具有应该的特定数据,使它们彼此之间独一无二。为什么我必须使用一个枚举?另外,我不希望每次意识到需要新的领域时都必须打破OCP。仅仅能够创建一个对象而不必担心外部管理将是很棒的。第1阶检索还是不错的。
我当然可以使用字符串键来检索它,但这意味着人们必须知道字符串,并且它不是非常安全的类型...枚举很容易阅读。帮我堆栈溢出!
答案 0 :(得分:1)
这完全取决于您打算如何检索对象。例如,通常在创建WinForms应用程序时(在我知道数据绑定的神奇作用之前)并且我添加了一些内容来表示ListBox
,我可能想记住列表中每个对象的位置这样我以后就可以轻松取回它。我将创建Dictionary<Foo, int>
。同样,我可能希望允许基于列表中的位置进行快速查找,因此我将拥有一个Dictionary<int, Foo>
。换句话说,不要尝试将所有内容存储到一个Dictionary<>
中。根据用例进行定义。
您已经用AreaKey
定义了一个,并且假设没有两个对象具有相同的枚举,因此在这种情况下使用字典是有意义的。但是,我认为您尝试将所有内容都放入一个键的方向是错误的。相反,您可能希望在引用Dictionary<string, Area>
的位置使用另一个Area.name
,以便您不仅可以按枚举查找,还可以按名称查找。
稍后您可能想添加PostCode
,所以再加上一个Dictionary<int, Area>
才有意义。
概括地说,定义:
Dictionary<string, Area> mapAreasByName;
Dictionary<int, Area> mapAreasByPostCode;
var area = mapAreasByName["New York"];
area = mapAreasByPostCode[2000];