Подтвердить что ты не робот

Добавление словаря в другой

Возможные дубликаты:
Слияние словарей на С#
Какой самый быстрый способ скопировать значения и ключи из одного словаря в другой в С#?

У меня есть словарь, который имеет в нем несколько значений, например:

Animals <string, string>

Теперь я получаю другой похожий словарь, скажем:

NewAnimals <string,string>

Как я могу добавить весь словарь NewAnimals к Animals?

4b9b3361

Ответ 1

foreach(var newAnimal in NewAnimals)
    Animals.Add(newAnimal.Key,newAnimal.Value)

Примечание: это генерирует исключение на дубликат ключа.


Или если вы действительно хотите использовать маршрут метода расширения (я бы этого не сделал), тогда вы могли бы определить общий метод расширения AddRange, который работает на любом ICollection<T>, а не только на Dictionary<TKey,TValue>.

public static void AddRange<T>(this ICollection<T> target, IEnumerable<T> source)
{
    if(target==null)
      throw new ArgumentNullException(nameof(target));
    if(source==null)
      throw new ArgumentNullException(nameof(source));
    foreach(var element in source)
        target.Add(element);
}

(выбрасывает дубликаты клавиш для словарей)

Ответ 2

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

Реализация:

 public static void AddRange<T, S>(this Dictionary<T, S> source, Dictionary<T, S> collection)
 {
        if (collection == null)
        {
            throw new ArgumentNullException("Collection is null");
        }

        foreach (var item in collection)
        {
            if(!source.ContainsKey(item.Key)){ 
               source.Add(item.Key, item.Value);
            }
            else
            {
               // handle duplicate key issue here
            }  
        } 
 }

Применение:

Dictionary<string,string> animals = new Dictionary<string,string>();
Dictionary<string,string> newanimals = new Dictionary<string,string>();

animals.AddRange(newanimals);

Ответ 3

Самый очевидный способ:

foreach(var kvp in NewAnimals)
   Animals.Add(kvp.Key, kvp.Value); 
  //use Animals[kvp.Key] = kvp.Value instead if duplicate keys are an issue

Так как Dictionary<TKey, TValue> явно реализует метод ICollection<KeyValuePair<TKey, TValue>>.Add, вы также можете сделать это:

var animalsAsCollection = (ICollection<KeyValuePair<string, string>>) Animals;

foreach(var kvp in NewAnimals)
   animalsAsCollection.Add(kvp);

Жаль, что класс не имеет метода AddRange, например List<T>.

Ответ 5

Вы можете прокрутить все Животные, используя foreach, и поместить их в NewAnimals.