代码:
Dictionary<string, IList<PuntoMappa>> first = new Dictionary<string, IList<PuntoMappa>>();
Dictionary<string, IList<PuntoMappa>> second = new Dictionary<string, IList<PuntoMappa>>();
second = second.Union(first);
似乎我错过了一个明确的演员吗?
答案 0 :(得分:4)
second
是Dictionary<string, IList<PuntoMappa>>
,而Union
的返回类型是IEnumerable<KeyValuePair<string, IList<PuntoMappa>>>
。您需要将其转换回字典。
second = second.Union(first).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
正如评论所指出的,如果你有重复的密钥,这可能不起作用。如果您希望将列表与两个词典中的匹配键合并,那么您可以使用Join
:
second = first.Join(second, kvp => kvp.Key, kvp => kvp.Key, (pair1, pair2) => new { Name = pair1.Key, PuntoMappas = pair1.Value.Union(pair2.Value) })
.ToDictionary(p => p.Name, p => p.PuntoMappas.ToList());
答案 1 :(得分:2)
“Union”返回一个IEnumerable - 而不是字典。
如果你想要IEnumerable - 你需要一个新的变量:
var newEnumerable = second.Union(first);
或者 - 创建一个新词典:
second = second.Union(first).ToDictionary(kv => kv.Key, kv => kv.Value);
答案 2 :(得分:0)
Union
将您的两个词典视为IEnumerable<KeyValuePair<string, IList<PuntoMappa>>
s - 它实际上只是“我已经返回此KVP,如果没有则返回,否则不要” ,不要通过合并匹配键的列表来尝试任何巧妙的事情。
为了实现我相信你正在寻找的东西,你需要像
这样的东西first.Concat(second)
.GroupBy(kvp => kvp.Key)
.ToDictionary(
g => g.Key,
g => g.SelectMany(kvp => kvp.Value).ToList());