Использование словаря как класс

В целях сериализации XML мне пришлось расформировать коллекцию словарей, которую я использовал. Я написал очень простую альтернативу, которая состоит из 2 классов:

  • NameValueItem: содержит имя (ключ) и значение
  • NameValueCollection: наследуется от CollectionBase и поддерживает коллекцию объектов NameValueItem.

Я включил несколько стандартных методов, чтобы помочь поддерживать коллекцию (Добавить, Содержит и Удалить). Так что, как и большинство типов словаря, имя (или ключ) является уникальным:

    public bool Contains(NameValueItem item)
    {
        foreach (NameValueItem lItem in List)
            if(lItem.Name.Equals(item.Name))
                return true;

        return false;
    }

Add использует этот метод Contains, чтобы определить, включать ли данный элемент в коллекцию:

    public void Add(NameValueItem item)
    {
        if (!Contains(item))
            List.Add(item);
    }

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

Я думал о создании NameValueHashSet, который является производным от HashSet.

Необязательный...:

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

Я хотел добавить 2 свойства в NameValueCollection, Names и Values, которые возвращают список строк из коллекции объектов NameValueItem. Вместо этого я встроил их в методы GetNames() и GetValues ​​(), так как мне нужно построить коллекцию (т.е. создать список (имена / значения), перебрать коллекцию, добавить имена / значения в список и вернуть список).

Это лучшая альтернатива? С точки зрения хорошей практики кодирования, производительности и т. Д.? Поскольку мои мысли о свойствах всегда сводились к тому, чтобы оно было как можно более урезанным, чтобы существовали только ссылки, арифметика и т. Д., Без слоев процессов. Если это так, то он должен быть встроен в метод. Мысли?

1 ответ

Возможно, вам не следует пытаться перестраивать то, что фреймворк уже предоставляет? Ваша реализация словаря будет работать плохо, поскольку она не масштабируется. Встроенный Dictionary<TKey, TValue> имеет O(1) производительность доступа и для большинства операций вставки и удаления (если нет коллизий или внутреннее хранилище должно быть расширено).

Вы можете расширить существующий словарь, чтобы обеспечить поддержку сериализации XML; см. этот вопрос и ответы: Serialize Class, содержащий член Dictionary

Что касается вашего второго вопроса - словарь уже предоставляет методы для получения IEnumerable из ключей и значений. Это перечисляет ключи и / или значения в соответствии с запросом вызывающей стороны; это задержка выполнения и, вероятно, предпочтительнее, чем создание полного List каждый раз (который требует перебора всех элементов в словаре). Если звонящий хочет список, он просто делает dictionary.Values.ToList(),

Другие вопросы по тегам