Почему у Dictionary <TKey, TValue> нет метода Add, который принимает объект KeyValuePair? - PullRequest
4 голосов
/ 19 августа 2011

Согласно API .NET класс Dictionary<TKey, TValue> наследуется от ICollection<T>, где T равно KeyValuePair<TKey, TValue>. Как класс Dictionary<TKey, TValue> скрывает некоторые методы, которые он наследует от ICollection<T>?

Например:

ICollection<T> имеет метод ICollection.Add(T item) но когда вы используете объект Dictionary<TKey, TValue>, у него нет этого метода. Вы можете использовать только Dictionary<TKey, TValue>.Add(TKey key, TValue value). Нет Dictionary<TKey, TValue>.Add(KeyValuePair<TKey,TValue> kvp) метода.

Кто-нибудь знает почему? Как эти методы скрыты?

Ответы [ 5 ]

5 голосов
/ 19 августа 2011

Это делается путем явной реализации интерфейса и обеспечения конфиденциальности / защиты этой реализации ... см.

Вы всегда можете привести Dictionary к ICollection и затем вызвать Add - хотя я бы не стал этого делать, потому что я не знаю, сработает ли это...

4 голосов
/ 19 августа 2011

Они "скрыты", используют явная реализация интерфейса . Таким образом, вы можете использовать:

ICollection<KeyValuePair<Foo, Bar>> collection = dictionary;
collection.Add(...);

Согласно документации , что должно работать ... хотя обычно было бы просто использовать альтернативный подход.

2 голосов
/ 19 августа 2011

Поскольку у словаря есть явная реализация ICollection.Add.Вам нужно привести его к ICollection<KeyValuePair<TKey,TValue>>, прежде чем вы сможете его использовать.

Вы можете увидеть реализацию на MSDN

void ICollection<KeyValuePair<TKey, TValue>>.Add(
    KeyValuePair<TKey, TValue> keyValuePair
)
1 голос
/ 07 марта 2013

Если Dictionary напрямую подвергается перегрузке Add(KeyValuePair<TKey,TValue>), это предполагает, что, если у кого-то есть KeyValuePair<TKey,TValue> (например, полученный при перечислении другого словаря), лучше передать его такому методу, чем читать свойства Key и Value и передать их отдельно. На самом деле, верно обратное: передача всей структуры методу Add, который затем должен был ее разложить и передать ее члены с перегрузкой дискретного параметра, была бы менее эффективной, чем разложение структуры на ее элементы и передача их отдельно.

Обратите внимание, что если Dictionary хранит вещи внутренне в массиве типа структуры, который имеет KeyValuePair<TKey,TValue> в качестве поля (не свойства), то код выглядит так:

for var item in Dict1
{
  Dict2.Add(item);
}

может быть более эффективным, чем

for var item in Dict1
{
  Dict2.Add(item.Key, Item.Value);
}

но поскольку Dictionary будет разлагать любой переданный KeyValuePair, нет причин поощрять прежний стиль кода.

1 голос
/ 19 августа 2011

Для справки, код Dictionary<> для явно реализованного метода ICollection<>.Add():

void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> keyValuePair)
{
    this.Add(keyValuePair.Key, keyValuePair.Value);
}

Вы можете использовать его, поскольку он просто делает то, что вы, вероятно, сделали бы сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...