将3个词典合并为单个词典

时间:2010-11-02 15:30:20

标签: c# generics dictionary merge

I have the following 

Dictionary<string,string> dict1 has 3 items
"A"="1.1"
"B"="2.1"
"C"="3.1"

Dictionary<string,string> dict2 has 3 items
"A"="1.2"
"B"="2.2"
"C"="3.2"

Dictionary<string,string> dict2 has 3 items
"A"="1.3"
"B"="2.3"
"C"="3.3"

I want a final Dict dictFinal which is of type Dictionary<string,string[]>

"A"="1.1,1.2,1.3"
"B"="2.1,2.2,2.3"
"C"="3.1,3.2,3.3"

3 个答案:

答案 0 :(得分:3)

给定类似的键,提供所有词典的集合,并使用SelectMany来处理动态数量的数组项:

var dictionaries = new[] { dict1, dict2, dict3 };
var result = dictionaries.SelectMany(dict => dict)
                         .GroupBy(o => o.Key)
                         .ToDictionary(g => g.Key,
                                       g => g.Select(o => o.Value).ToArray());

dictionaries类型可能是List<T>,不一定是上面的数组。重要的是你将它们组合在一个集合中,以便LINQ覆盖它们。

答案 1 :(得分:1)

假设所有3个词典都具有相同的键,则应执行以下操作:

var d1 = new Dictionary<string, string>()
             {
                 {"A", "1.1"},
                 {"B", "2.1"},
                 {"C", "3.1"}
             };
var d2 = new Dictionary<string, string>()
             {
                 {"A", "1.2"},
                 {"B", "2.2"},
                 {"C", "3.2"}
             };

var d3 = new Dictionary<string, string>()
             {
                 {"A", "1.3"},
                 {"B", "2.3"},
                 {"C", "3.3"}
             };

var result = d1.Keys.ToDictionary(k => k, v => new[] {d1[v], d2[v], d3[v]});

答案 2 :(得分:0)

假设所有键都相同,最直接的方法是:

Dictionary<string,string[]> result = new Dictionary<string,string[]>();
foreach(var key in dict1.Keys)
{
    result[key] = new string[]{dict1[key], dict2[key], dict3[key]}; 
}