为什么这两个字典上的联盟不起作用?

时间:2012-11-16 13:34:06

标签: c# linq

代码:

    Dictionary<string, IList<PuntoMappa>> first = new Dictionary<string, IList<PuntoMappa>>();
    Dictionary<string, IList<PuntoMappa>> second = new Dictionary<string, IList<PuntoMappa>>();
    second = second.Union(first);

似乎我错过了一个明确的演员吗?

3 个答案:

答案 0 :(得分:4)

secondDictionary<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());