i like food Ответов: 3

Как объединить два словаря?


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



у меня есть этот код до сих пор:

using System;
using System.Collections.Generic;

namespace merging_dictionaries
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>
            {
                { "WA", "Western Autralia" },
                { "NSW", "New South Wales" },
                { "SA", "South Australia" },
                { "Q", "Queensland" },
                { "V", "Victoria" },
                { "T", "Tasmania" }
            };

            Dictionary<string, string> otherdict = new Dictionary<string, string>
            {
                { "1", "Adclarkia dawsonensis" },
                { "2", "Advena campbellii " },
                { "3", "Discocharopa vigens" },
                { "4", "Hyridella glenelgensis" },
                { "5", "Mathewsoconcha grayi ms" },
                { "6", "Mathewsoconcha phillipii" }//these names are of endangered australian molusks, why not?
            };

            MergeDictionary(dict, otherdict);
        }

        public static Dictionary<string, string> MergeDictionary(Dictionary<string, string> dict1, Dictionary<string, string> dict2)
        {
            foreach (var thing in dict1)
            {
                dict2.Add(thing.Key);//make it do something with Add. 
                dict2.Add(thing.Value);//here i am trying to make it add the key and the value, but i have no idea how. 
            }
        }
    }
}


Я не могу заставить это работать так, как задумано, если вообще могу.

Пожалуйста, помогите мне исправить это.

Спасибо.

Что я уже пробовал:

Я пробовал разные способы объединения словарей, но безуспешно.

Я пробовал разные способы добавления ключей и значений, по одному или все вместе, но безрезультатно.

Maciej Los

Мой виртуальный 5!

BillWoodruff

виртуальный +5

3 Ответов

Рейтинг:
8

Thomas Daniels

Вы используете Add неправильно, вы должны использовать его вот так:

dict2.Add(thing.Key, thing.Value);


Maciej Los

5ed!

0x01AA

В 5

Рейтинг:
20

Maciej Los

Проверьте эту нить: словарь - слияние словарей в C# - переполнение стека[^Есть несколько способов объединить/объединить словари.

Я бы улучшил их, добавив строку кода, которая будет проверять, является ли конкретная Key существует.

Удачи вам!


0x01AA

В 5

Maciej Los

Спасибо, Бруно.

BillWoodruff

+5

Maciej Los

Спасибо, Билл.

Рейтинг:
1

BillWoodruff

Мне нужно было что-то немного другое, что позволило бы мне уточнить ... в случае дубликатов ключей ... какой словарь является источником значения, взятого из повторяющихся пар KeyValuePairs, используемых в объединенном выводе:

using System;
using System.Collections.Generic;
using System.Linq;

namespace WhatEver
{
    public static class DictionaryExtensions
    {
        public static Dictionary<TKey, TValue> Merge<TKey, TValue>(this Dictionary<TKey, TValue> dict1,
            Dictionary<TKey, TValue> dict2, bool useDupValueFromDict1 = true)
        {
            if (dict1.Equals(dict2)) throw new ArgumentException("duplicate dictionaries");

            if (dict1 == null) throw new ArgumentException("dictionary 1 is null");

            if (dict2 == null) throw new ArgumentException("dictionary 2 is null");

            if (dict1.Count == 0) throw new ArgumentException("dictionary 1 has no items");

            if (dict2.Count == 0) throw new ArgumentException("dictionary 2 has no items");

            Dictionary<TKey, TValue> result;
            IEnumerable<KeyValuePair<TKey, TValue>> nondups;

            if (useDupValueFromDict1)
            {
                result = dict1;
                nondups = dict2.Where(kvp => !dict1.ContainsKey(kvp.Key));

            }
            else
            {
                result = dict2;
                nondups = dict1.Where(kvp => !dict2.ContainsKey(kvp.Key));
            }

            return result.Union(nondups).ToDictionary(kvp1 => kvp1.Key, kvp1 => kvp1.Value);
        }
    }
}
Другой вариант (не показанный здесь) позволяет указать функцию сравнения, которая будет выбирать, какая из повторяющихся пар KeyValuePairs используется.


Maciej Los

Вы сделали то, что я упомянул в своем ответе.
5ed!

BillWoodruff

Я всегда иду по следам гигантов :) моей мотивацией для написания этой книги несколько лет назад была необходимость контролировать, какие значения словаря использовались в случае дубликатов ключей.

0x01AA

"5" для этого.

BillWoodruff

Спасибо!