Трудность связана с объединением ключевых конфликтов.
Если мы начнем с выравнивания всех входных словарей, используя SelectMany
, мы можем сгруппировать элементы по их ключу.
var result = dictionaries
.SelectMany(dict => dict)
.GroupBy(kvp => kvp.Key)
Набор результатов содержит группы, в которых ключ каждой группы является ключом из исходных словарей, а содержимое группы представляет собой IEnumerable<List<T>>
списков с одинаковым ключом. Из этих групп мы можем объединить все List<T>
в один IEnumerable<T>
, используя преобразование Select
с SelectMany
.
var result = dictionaries
.SelectMany(dict => dict)
.GroupBy(kvp => kvp.Key)
.Select(grp => new { Key = grp.Key, Items = grp.SelectMany(list => list)})
Затем мы можем получить из этого словарь, используя преобразование ToDictionary
, преобразовав IEnumerable<T>
обратно в List<T>
.
var result = dictionaries
.SelectMany(dict => dict)
.GroupBy(kvp => kvp.Key)
.Select(grp => new { Key = grp.Key, Items = grp.SelectMany(list => list)})
.ToDictionary(kip => kip.Key, kip => new List<T>(kip.Items));
Обновлено в ответ на комментарий
Вы можете заполнить dictionaries
так, как вам нравится. Я предположил, что это тип, который реализует IEnumerable<IDictionary<TKey, List<T>>>
для TKey
и T
по вашему выбору.
Самый простой способ - использовать List<T>
следующим образом:
List<IDictionary<TKey, List<T>>> dictionaries
= new List<IDictionary<TKey, List<T>>>();
dictionaries.Add(dictionary1); // Your variable
dictionaries.Add(dictionary2); // Your variable
// Add any other dictionaries here.
// Code as above!