IDictionary <строка, строкa> или имяValueCollection

У меня есть сценарий, в котором я могу использовать либо NameValueCollection, либо IDictionary. Но я хотел бы знать, какой из них будет лучше по производительности.

- Использование NameValueCollection

NameValueCollection options()
{
    NameValueCollection nc = new NameValueCollection();

    nc = ....; //populate nc here

    if(sorting)
       //sort NameValueCollection nc here

    return nc;
}

- используя IDictionary

IDictionary<string, string> options()
{
    Dictionary<string, string> optionDictionary = new Dictionary<string, string>();

    optionDictionary = ....; //populate

    if(sorting)
       return new SortedDictionary<string, string>(optionDictionary);
    else
       return optionDictionary;
}

Ответ 1

Эти типы коллекций не являются полностью взаимозаменяемыми: NameValueCollection позволяет получить доступ через целые индексы. Если вам не нужны эти функции, вы не должны использовать NameValueCollection, поскольку индексирование не приходит "бесплатно".

В зависимости от количества строк, на которые вы смотрите, я бы рассмотрел либо Hashtable, либо IDictionary. Krzysztof Cwalina обсуждает тонкости здесь: http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx,

Ответ 2

Другим преимуществом IDictionary является то, что он не является специфичным для реализации в отличие от NameValueCollection.

Ответ 3

Я согласен с fatcat и lomaxx (и проголосовал за оба ответа). Я бы добавил, что производительность типов коллекций, скорее всего, будет последним при выборе между типами коллекций. Используйте тот тип, который наиболее соответствует вашим потребностям в использовании. Если вы находитесь в критическом для производительности разделе кода (и, скорее всего, вы его не знаете), то единственным ответом является измерение каждого случая - не верьте Interweb, верьте числам.

Ответ 4

A NameValueCollection в .NET - это в основном то, что используется для QueryStrings для хранения пар ключ/значение. Самое большое различие заключается в том, что добавляются два элемента с одним и тем же ключом. В IDictionary существует два способа установить значение. Использование метода .Add() вызовет ошибку при дублировании ключа, когда ключ уже существует. Но просто установка элемента, равного значению, перепишет значение. Вот как IDictionary обрабатывает дубликаты ключей. Но NameValueCollection добавит такие значения: "value1, value2, value3". Таким образом, существующее значение элемента добавляется с запятой, а затем новое значение добавляется к нему каждый раз.

Мне кажется, что это NameValueCollection было создано специально для использования и доступа QueryString. QueryString, как "? A = 1 & b = 2 & a = 3" в .NET, даст результат элемента [ "a" ] = "1,3". Эта разница в том, как обрабатываются повторяющиеся ключи, является "реальной" разницей, то есть самой большой разницей между ними.

Я подозреваю, что NameValueCollection также не использует хеш-таблицу для быстрого доступа к ключам, когда коллекция велика, потому что этот доступ медленнее для небольших коллекций, чем без хеш-таблицы. Я не нашел окончательную информацию, которая указывает, использует ли NameValueCollection или не использует хеш-таблицу для доступа к ключам. Я знаю, что IDictionary использует хеш-таблицу, так что доступ к ключам в IDictionary со многими клавишами довольно быстр. Поэтому я подозреваю, что NameValueCollection быстрее для небольших коллекций, чем IDictionary. Если моя догадка правильная, то это означает, что Shift NameValueCollection не будет использоваться для больших коллекций, поскольку чем больше он, тем массивнее замедляется без хэш-таблицы для доступа к клавишам.

Для количества ключей в querystring это число обычно очень мало, поэтому я думаю, что NameValueCollection не использует хэши для лучшей производительности. Но если Microsoft разработала все для производительности и для чего лучше всего их пользователей, Windows wud будет настолько отличной, как сегодня. Поэтому мы не можем предположить ничего, что "должно быть".

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