Как объединить два словаря в C # с дубликатами - PullRequest
2 голосов
/ 19 апреля 2010

Есть ли способ в C # объединить два словаря? У меня есть два словаря, которые могут иметь одинаковые ключи, но я ищу способ их объединения, так что, в конце концов, есть словарь с одним ключом и значения из обоих словарей объединены. Я нашел следующий код, но он не обрабатывает дубликаты.

Dictionary Mydictionary<string, string[]> = new Dictionary<string, string[]>();
Mydictonary.Union(secondDictionary).ToDictionary( pair => pair.Key, pair => pair.Value);

Ответы [ 3 ]

2 голосов
/ 19 апреля 2010

Если вам нужен подход LINQ, попробуйте это:

Dictionary<string, string[]> firstDic = new Dictionary<string, string[]>  
{  
    {"apple", new [] {"red"}},  
    {"orange", new [] {"orange"}}  
};

Dictionary<string, string[]> secondDic = new Dictionary<string, string[]>
{
    {"apple", new [] {"green"}},
    {"banana", new [] {"yellow"}}
};

Dictionary<string, string[]> resultDic = firstDic.Union(secondDic)
    .GroupBy(o => o.Key)
    .ToDictionary(o => o.Key, o => o.SelectMany(kvp => kvp.Value).ToArray());

Для примеров данных вы получите словарь с 3 KeyValuePairs, а элемент с ключом «apple» будет иметь массив с «красным» и «зеленым» для значения.

1 голос
/ 19 апреля 2010

Может быть, что-то вроде этого:

foreach (var value in secondDictionary)
    if (myDictionary.Contains(value.Key))
        myDictionary[value.Key] = myDictionary[value.Key]
                                     .Concat(value.Value).ToArray();
    else
        myDictionary[value.Key] = value.Value;
0 голосов
/ 19 апреля 2010

Это должно сделать это:

Dictionary<string, string[]> dict1 = new Dictionary<string, string[]>();
Dictionary<string, string[]> dict2 = new Dictionary<string, string[]>();

Dictionary<string, List<string>> combined = new Dictionary<string, List<string>>();

foreach (var pair in dict1) combined.Add(pair.Key, new List<string>(pair.Value));
foreach (var pair in dict2)
{
    List<string> list;

    if (!combined.TryGetValue(pair.Key, out list)) combined.Add(pair.Key, list = new List<string>());

    list.AddRange(pair.Value);
}

Если вы действительно хотите получить результат как Dictionary<string, string[]>, вы можете добавить его в конец:

Dictionary<string, string[]> combinedArray = new Dictionary<string, string[]>();

foreach (var pair in combined) combinedArray.Add(pair.Key, pair.Value.ToArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...