Удалить общие ключи из двух словарей и добавить оставшиеся кадры в новый третий словарь? - PullRequest
0 голосов
/ 01 июля 2018

У меня есть два словаря dict1 и dict2.

Я удалил общие ключи и сохранил их в другом файле.

var otherEntry = dict1.Keys.Except(dict2.Keys);

как мне добавить данные "otherEntry" в новый словарь dict3?

Ответы [ 4 ]

0 голосов
/ 01 июля 2018

Вам просто нужно присоединиться к otherEntry с dict1. Оператор Join вернет IEnumerable, который вам нужно будет преобразовать в словарь, используя метод ToDictionary, поскольку в качестве результата вы хотите использовать словарь.

dict1
    .Join(otherEntry, d1 => d1.Key, other => other, (d1, other) => d1)
    .ToDictionary(d1 => d1.Key, d1 => d1.Value);

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

var otherEntry = 
        from d1 in dict1
        join d2 in dict2 on d1.Key equals d2.Key into matchingGroup
        where !matchingGroup.Any()
        select d1;

var dict3 = otherEntry.ToDictionary(d3 => d3.Key, d3 => d3.Value);
0 голосов
/ 01 июля 2018

Из моего понимания требований

Возьмите все необычные предметы между двумя словарями и поместите их в новый словарь

Рассмотрим следующее

var dict3 = dict1.Concat(dict2)
    .GroupBy(_ => _.Key)
    .Where(_ => _.Count() == 1)
    .SelectMany(_ => _)
    .ToDictionary(_ => _.Key, _ => _.Value);

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

Оттуда это просто вопрос создания словаря из оставшихся предметов.

0 голосов
/ 01 июля 2018

Я бы сказал

Dictionary<string, string> dict1 = new Dictionary<string, string>();
dict1.Add("abc", "hello");
dict1.Add("def", "world");

Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2.Add("hij", "bonjour");
dict2.Add("abc", "le monde");


 Dictionary<string, string> dict3 = dict1
 .Where(kvp => !dict2.ContainsKey(kvp.Key))
 .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
0 голосов
/ 01 июля 2018

Вы можете сделать это через цикл foreach, например

foreach (KeyValuePair<string, List<string>> item in dict1) {
  otherEntry.Add(item);
  if (dict2.ContainsKey(item.Key)) {
    dict2.Remove(item.Key);
  }
}

, а затем

foreach (KeyValuePair<string, List<string>> item in dict2) {
  otherEntry.Add(item);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...