Существует ли общая альтернатива классу 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 поддерживается массивом отсортированных ключей и значений массива.