зачем останавливаться? Почему не список триплетов? Или квадруплеты?
Дело в том, что это очень тривиально написать себе. Напишите класс, который происходит от List<KeyValuePair<TKey, TValue>>
, добавьте метод Add
, который принимает 2 параметра.
public class KeyValueList<TKey, TValue> : List<KeyValuePair<TKey, TValue>>
{
public void Add(TKey key, TValue value)
{
Add(new KeyValuePair<TKey, TValue>(key, value));
}
}
Бум, все готово.
Дополнительные замечания: Обратите внимание, что KeyValuePair<TKey, TValue>
непреложный типа (как в .NET 4.0 Tuple<T1, T2>
); так что если вы хотите, чтобы иметь возможность сделать что-то вроде этого:
list[0].Value = 5;
... тогда вам нужен изменяемый тип, что-то вроде:
public sealed class Pair<T1, T2>
{
public T1 X { get; set; }
public T2 Y { get; set; }
}
public class PairList<T1, T2> : List<Pair<T1, T2>>
{ /* ...same as KeyValueList<T1, T2>, basically... */ }
Также обратите внимание, что это позволило бы хороший синтаксис инициализации:
var list = new PairList<int, string>
{
{ 1, "dan" },
{ 2, "serhio" }
};
Но снова, дело здесь в том, что это очень легко и очень тривиальна и, таким образом, на самом деле не заслуживает своего собственного типа в рамках , Посмотрите на это так: можете ли вы назвать любой тип в BCL, который по существу является только еще одним номером, но с добавлением одного удобного метода?
Закрыв комментарии: Вы поставили эти вопросы:
- Зачем использовать
List<T>
тип, когда вы могли бы просто использовать T[]
массив?
- Зачем вводить тип
Dictionary<TKey, TValue>
, если вы могли бы просто использовать List<KeyValuePair<TKey, TValue>>
?
Это странные вопросы, честно говоря. Зачем вообще вводить ООП, когда вы можете просто делать все с процедурным кодом и глобальными переменными? Зачем вводить языки программирования более высокого уровня, такие как C#, C++ или даже C, когда вы могли бы просто написать все в Assembly?
List<T>
класс обеспечивает полезный инкапсуляцию всей функциональности, которая входит в доступе к элементам массива, сохраняя количество элементов, изменение размера массива по мере необходимости, и т.д. Существует большая разница между тем, что вас может делать с List<T>
и что вы можете сделать только с T[]
.
Dictionary<TKey, TValue>
также включает в себя функции сохранения коллекции значений, связанных с уникальными ключами. Он также обеспечивает время поиска O (1) для этих ключей. Существует огромная разница между Dictionary<TKey, TValue>
и List<KeyValuePair<TKey, TValue>>
.
Разница между List<KeyValuePair<TKey, TValue>>
и предложенными вами KeyValueList<TKey, TValue>
(как я уже назвал выше) практически равна нулю. Вряд ли что-то новое инкапсулировано. Это только is a List<T>
. Честно говоря, для меня это выгодно, чуть больше, чем добавление типа Int32List
, который просто обертывает List<int>
.
Просто нет причин добавлять такой тип к BCL.
... почему бы просто не использовать 'List>'? –
Mehrdad
@Mehrdad: немного «сложно» его построить.- Я имею в виду, что вы должны закодировать небольшой строительный ключValuePairs, а затем объединить их в список. Наконец, почему был создан список ? Вы можете использовать Массивы! :) – serhio
Это проще в использовании Tuple, чем KeyValuePair - и более подходящее тоже. –