Подтвердить что ты не робот

С#: различия между различными <string, string> Collections

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

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

Есть ли у кого-нибудь чит-лист? полный список различий между различными вариантами?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вот объем моих знаний об этом:



    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 [msdn]

    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