С#: различия между различными <string, string> Collections
Вот вопрос, который я всегда возвращаю слишком часто:
Какую лучшую коллекцию <string, string>
использовать для некоторой ситуации xyz (чаще всего для привязки к DropDownList
)?
Есть ли у кого-нибудь чит-лист? полный список различий между различными вариантами?
Ответы
Ответ 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