Каковы способы различения объектов одного типа для поиска, сравнения и т. Д. В c # - PullRequest
0 голосов
/ 22 ноября 2018

Я прошу прощения за странное название, я не знал, как задать вопрос, поэтому, если у вас есть какие-либо предложения относительно того, что было бы более уместно, дайте мне знать, и я обновлю его.

Часто при программировании я бы использовал Enums в качестве ключей к словарям, значениями которых являются данные, относящиеся к enum.Обычно я делаю это до того, как осознаю, что с этим перечислением будет связано много данных, что затем приведет меня к созданию типа данных.

Например, у меня может быть перечисление:

public enum AreaKey
{
    Home,
    Hospital,
    Park,
    TrainStation
}

, а затем словарь (Vector2 - класс с 2 целыми числами):

Dictionary<AreaKey, Vector2> areaCoordinatesByAreaKey;

Позже я решу, что хочу получить кучу других данных, связанных с этой областью, поэтомувместо этого я создаю новый класс с именем:

    public class Area
    {
        Vector2 coordinates;
        string name;
        // more data
    }

Теперь, чтобы ссылаться на эти данные, я знаю, что могу просто создать словарь, используя тот же enum, что и ключ, для извлечения указанной области, но это всегда кажется громоздкимдля меня, и почти как будто это не правильно ООП.

У меня есть объекты области.У них есть конкретные данные, которые должны сделать их уникальными друг от друга.Почему я должен использовать enum?Кроме того, мне не нравится ломать OCP каждый раз, когда я понимаю, что мне нужна новая область.Было бы здорово просто создать объект и не беспокоиться о внешнем управлении.Хотя поиск порядка 1 - это хорошо.

Конечно, я мог бы использовать ключ строки, чтобы получить его, но это означает, что люди должны знать строки, и это не очень безопасно для типов ... Перечисления легко читаются.Помогите мне переполнить стек!

1 Ответ

0 голосов
/ 22 ноября 2018

Это полностью зависит от того, как вы намереваетесь получить объект.Например, обычно при создании приложений WinForms (прежде чем я узнал о магии привязки данных ), и я добавил элементы, чтобы сказать ListBox, я мог бы захотеть запомнить положение каждого объекта в списке, чтобы яможет легко получить его позже.Я бы создал Dictionary<Foo, int>.Точно так же я могу разрешить быстрый поиск на основе позиции в списке, чтобы у меня был Dictionary<int, Foo>.Другими словами не пытаться сохранить все в один Dictionary<>. Определить их в зависимости от случая.

Вы уже определилиодин на AreaKey, и это предполагает, что никакие два объекта не имеют одинаковое перечисление, и поэтому использование словаря в этом случае имеет смысл.Тем не менее, я думаю, что вы идете по неверному пути, пытаясь объединить все в один ключ.Вместо этого вам может понадобиться другой Dictionary<string, Area>, где он ссылается на Area.name, чтобы вы могли искать не только по enum, но и по имени.

Позже вы, возможно, захотите добавить PostCode, поэтому еще раз имеет смысл Dictionary<int, Area>.

В итоге определите:

Dictionary<string, Area> mapAreasByName;
Dictionary<int, Area> mapAreasByPostCode;

var area = mapAreasByName["New York"];
area = mapAreasByPostCode[2000];
...