C #: различия между различными коллекциями <string, string> - PullRequest
13 голосов
/ 28 июля 2011

Вот вопрос, к которому я всегда возвращаюсь слишком часто:

Какую коллекцию <string, string> лучше всего использовать в некоторых ситуациях xyz (чаще всего для привязки к DropDownList)?

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

Ответы [ 2 ]

5 голосов
/ 28 июля 2011

Если вы привязываетесь к раскрывающемуся списку, вы, вероятно, имеете в виду порядок сортировки, и размер коллекции (скорее всего и в большинстве случаев использования) будет достаточно мал, чтобы избежать проблем с производительностью. В этих случаях List<KeyValuePair<string, string>> является довольно простым выбором, хотя BindingList может лучше работать для связывания, особенно в WPF.

Tuple<string, string> может заменить KeyValuePair даже.

Кроме того, неуниверсальные (не строго типизированные) коллекции часто дают наихудшую производительность при использовании бокса (помимо громоздкости в работе), и если вы беспокоитесь о накладных расходах списка, вы можете указать максимальный размер на создание, чтобы минимизировать это. Другое преимущество универсальных классов состоит в том, что они реализуют IEnumerable для использования с Linq и, по моему опыту, имеют тенденцию быть более широко используемыми и более известными вашим коллегам. В общем, должен быть один очевидный способ сделать что-то на языке, и сообщество .Net выбрало Dictionary<string, string> вместо StringDictionary.

Вы также можете добавить методы расширения, чтобы сделать базовые списки более удобными:

public static class ListKeyValuePairExtensions
{
    public static void Add<S, T>(this List<KeyValuePair<S, T>> list, S key, T value)
    {
        list.Add(new KeyValuePair<S, T>(key, value));
    }
}

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

1 голос
/ 29 июля 2011

Вот степень моих знаний по этому вопросу:



    StringDictionary strDict = new StringDictionary();
        // + Strong Type
        // - lowercases the key
        // - random order ?
        // - older approach, .Net 1 which predates generics

    Dictionary<string, string> dict = new Dictionary<string, string>();
        // + Strong Type
        // - random order ?

    List<KeyValuePair<string, string>> listKVP = new List<KeyValuePair<string, string>>();
        // + Strong Type
        // + Keeps order as inserted
        // - more complex to instanciate and use

    Hashtable hash = new Hashtable();
        // Automatically sorted by hash code
        // Better for big collections
        // - not strong typed

    ListDictionary listDict = new ListDictionary();
        // + faster than Hashtable for small collections (smaller than 10)
        // - not strong typed

    HybridDictionary hybridDict = new HybridDictionary();
        // Better compromise if unsure of length of collection
        // - not strong typed

    OrderedDictionary orderDict = new OrderedDictionary();
        // + Keeps order as inserted
        // - not strong typed

    SortedDictionary<string, string> sortedDict = new SortedDictionary<string, string>();
        // + Strong Type
        // Automatically sorted by key
        // + faster lookup than the Dictionary [<a href="http://msdn.microsoft.com/en-us/library/6tc79sx1(v=vs.80).aspx" rel="nofollow">msdn</a>]

    SortedList<string, string> sortedList = new SortedList<string, string>();
        // + Strong Type
        // Automatically sorted by key
        // Almost same as SortedDict, but can access by index []

    KeyValuePair<string, string>[] arrayKVP = new KeyValuePair<string, string>[123];
        // + Strong Type
        // + Keeps order as inserted
        // - Fixed size

...