Существует ли общая альтернатива классу ListDictionary?
Я смотрел на некоторый пример кода, и в нем они использовали объект ListDictionary
для хранения небольшого количества данных (около 5-10 объектов или около того, но это число со временем могло меняться). Единственная проблема с этим классом заключается в том, что, в отличие от всего, что я делал, он не является общим. Это означает, и исправьте меня, если я ошибаюсь здесь, что каждый раз, когда я получаю объект отсюда или перечисляю его, что происходит литье. Достаточно ли накладных расходов в более крупном объекте Dictionary<T>
, чтобы оправдать накладные расходы не-generic ListDictionary
?
Код, который будет использовать этот объект, будет перечислить на каждой загрузке страницы, которую я предполагаю, поэтому класс ListDictionary
использовался по одной из других альтернатив. Именно поэтому я хотел бы получить максимальную производительность из этого списка данных.
Ответы
Ответ 1
К сожалению, не существует общего эквивалента ListDictionary.
Однако его не должно быть сложно реализовать. ListDictionary по существу работает, сохраняя связанный список пар "ключ/значение" и итерации по ним для операций поиска. Вы можете построить ListDictionary<TKey,TValue>
, обернув LinkedList<T>
с помощью очень простых выражений LINQ.
Например
public class LinkedDictionary<TKey,TValue> {
private LinkedList<KeyValuePair<TKey,TValue>> _list = new LinkedList<KeyValuePair<TKey,TValue>>();
private IEqualityComparer<TKey> _comp = EqualityComparer<TKey>.Default;
public void Add(TKey key, TValue value) {
_list.Add(new KeyValuePair<TKey,TValue>(key,value));
}
public TValue Get(TKey key) {
return _list.Where(x => _comp.Equals(x.Key,key)).First().Value;
}
...
}
Ответ 2
Если данные, хранящиеся в ListDictionary, всегда являются объектами (классами), а не типами значений, то это, вероятно, будет быстрее, чем Dictionary <T> . Если вы будете хранить типы значений (structs, int, double и т.д.), Тогда стоимость бокса/распаковки, скорее всего, уравновесит ситуацию, и я бы рекомендовал Dictionary <T> вместо этого.
В целом, однако, я хотел бы указать, что разница в производительности между этими двумя, вероятно, будет наименее из ваших проблем с производительностью в целом. Маленькие вещи, подобные этому, как правило, являются последним, о чем нужно беспокоиться, когда речь заходит о оптимизации производительности. Более масштабные вещи, такие как межпроцессные вызовы, взаимодействие с базами данных и веб-сервисами и т.д., Должны быть рассмотрены прежде, чем когда-либо быть обеспокоены незначительной разницей в производительности между ListDictionary и Dictionary <T> .
Ответ 3
Простая проверка класса MSDN-ListDictionary покажет
Это простая реализация IDictionary с использованием односвязной список. Он меньше и быстрее, чем Hashtable, если количество элементов 10 или меньше. Это не следует использовать, если производительность важна для больших количество элементов.
Ответ 4
Мы можем использовать
System.Collections.Generic.Dictionary<Object,Object> dictTemp = new System.Collections.Generic.Dictionary<Object,Object>();
В качестве примера рассмотрим следующее:
using System.Collections.Specialized;
private ListDictionary g_Attributes = new ListDictionary();
public ListDictionary Attributes
{
get { return this.g_Attributes; }
}
public string GetAttribute(string name)
{
if (HasAttribute(name))
return (string) g_Attributes[name];
else
return null;
}
public bool HasAttribute(string name)
{
return this.Attributes.Contains(name);
}
using System.Collection.Generic;
private Dictionary<string, object> g_Attributes = new Dictionary<string, object>();
public Dictionary<string, object> Attributes
{
get { return this.g_Attributes; }
}
public string GetAttribute(string name)
{
if (HasAttribute(name))
{
return g_Attributes[name].ToString();
}
else
{
return null;
}
}
public bool HasAttribute(string name)
{
return this.Attributes.ContainsKey(name);
}
Я думаю, это поможет вам немного!
Ответ 5
Нет общего эквивалента ListDictionary
.
Если ваше использование этого небольшого словаря не во власти Add
и Remove
, вы можете рассмотреть SortedList<TKey, TValue>
, который, несмотря на свое название, реализует IDictionary<TKey, TValue>
. В отличие от ListDictionary
, который поддерживается односвязным списком, SortedList
поддерживается массивом отсортированных ключей и значений массива.