Использование словаря как класс
В целях сериализации 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()
,