在C#中区分相同类型的对象以进行检索,比较等的方法是什么

时间:2018-11-21 23:16:18

标签: c# oop object enums open-closed-principle

我为这个奇怪的标题表示歉意,我不确定如何问这个问题,因此,如果您对哪个更合适有任何建议,请告诉我,我会进行更新。

通常在编程时,我会使用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阶检索还是不错的。

我当然可以使用字符串键来检索它,但这意味着人们必须知道字符串,并且它不是非常安全的类型...枚举很容易阅读。帮我堆栈溢出!

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];