KeyValuePair против NameValueCollection

Есть и другие вопросы, такие как KeyValuePair vs. IDictionary, но я чувствую, что это немного отличается.

NameValueCollection принимает строковый ключ и строковое значение.

KeyValuePair похож на словарь, вы говорите ему, какой тип ключ и значение.

Я не понимаю, почему NameValueCollection существует. Инициализация KeyValuePair со строками типа кажется достаточной. Я также заметил, что NameValueCollection имеет несколько доступных ему методов, но опять же, почему бы не объединить оба класса в один?

Ответ 1

A KeyValuePair не похож на словарь. Это просто кортеж, содержащий ключ и значение.

NameValueCollection - это оболочка над количеством IList<KeyValuePair<string,IList<string>>> (обратите внимание, что NameValueCollection предшествует дженерикам) - операции типа Get(string) равны O(n), и элементы могут быть выбраны индексом, а каждый ключ сопоставляется с одним или несколькими Значения (это отличается от a Dictionary<string,string>).

Причина этого объясняется в документации NameValueCollection:

Этот класс может использоваться для заголовков, строк запроса и данных формы.

Более новая структура данных с некоторым сходным поведением для NameValueCollection Lookup<string,string>. (Тем не менее, он не поддерживает напрямую те же операции, что и неизменные, как заметки заметок.) ​​

Счастливое кодирование.

Ответ 2

NameValueCollection, существующий в .NET 1.0 и 1.1, KeyValuePair является общим типом и не был добавлен в .NET до 2.0. Все классы в System.Collections.Specialized все предшествуют добавлению дженериков; он содержит определенные строго типизированные (специализированные, если вы будете) для использования, когда именно то, что вам нужно пользователям, не нужно отбрасывать из объекта в строку.

Ответ 3

KeyValuePair - это компонент, который вы используете для итерации Dictionary

var dictionary = new Dictionary<int,long>

foreach(var kvp in dictionary)
{
    // kvp is KeyValuePair<int,long>. kvp.Key is the int key and kvp.Value is the long value for the key
}

NameValueCollection является индексируемым.