Dictionary 与地图的复杂交集

Dictionary 与地图的复杂交集,dictionary,set-theory,Dictionary,Set Theory,我有两张K,V类型相同的地图 关键是国家 价值观是一张价值观的地图 因此,整个地图结构是 Map <String, Map<String, List<City>>> m1, m2; 输出应该是 Common = { India = [TA -> {City1, City2, City3} ] USA = [WI -> {City1, City3}] } 有没有更好的方法来获取这些信息,而不是在整个列表中循环并逐行检查(即

我有两张K,V类型相同的地图

关键是国家

价值观是一张价值观的地图

因此,整个地图结构是

 Map <String, Map<String, List<City>>> m1, m2;
输出应该是

Common = { India = [TA -> {City1, City2, City3} ]
           USA = [WI -> {City1, City3}] }
有没有更好的方法来获取这些信息,而不是在整个列表中循环并逐行检查(即使有一个已经定义的方法可以做到这一点,这也很好)

我将使用它,以便我知道,在过去几年中,唯一发生变化的是少数几个城市和少数几个州

如有需要,我们将乐意进一步澄清


提前感谢。

对于这两个贴图,最好的方法是通过每个键递增

但是,对于列表,如果列表已排序,请在列表的元素之间使用


干杯

很大程度上取决于要用于存储数据的收集类型。另一个因素是您将要使用的技术。然后还取决于代码的效率和可读性。我最喜欢的语言是C#,所以我会选择它。然后,按照您的建议,将整个过程实现为
字典

为了获取数据,我使用了LINQ,因为它提供了非常可读的代码

我实现了如下示例(为了简单起见,城市是简单字符串):

如果您调试它并展开
result
,您将看到它返回您在示例中期望的值


请注意,您的
City
类必须实现
IEquatable
接口,以便在
Intersect
方法中正确处理它。我明白了,谢谢你的想法。不幸的是,它们也没有被排序。在这种情况下,可能是heapsort然后进行二进制搜索。合理的逻辑。谢谢你。我将尝试它,如果它起作用,我将返回:)。再次感谢回复中提到的,我在简单字符串上测试了它。如果您将字典和查询复制到VisualStudio项目中并运行它,您将得到结果。但是对于
City
类,您需要实现
IEquatable
接口来测试它是否工作。
Common = { India = [TA -> {City1, City2, City3} ]
           USA = [WI -> {City1, City3}] }
var m1 = new Dictionary<string,Dictionary<string,List<string>>>
{
    {
        "India", new Dictionary<string, List<string>> 
                    {
                        {"TA", new List<string> {"City1", "City2", "City3"}},
                        {"KA", new List<string> {"City1", "City2"}}
                    }
    },
    {
        "USA", new Dictionary<string, List<string>> 
                    {
                        {"WI", new List<string> {"City1", "City2", "City3"}},
                        {"OH", new List<string> {"City1", "City2"}}
                    }
    }
};

var m2 = new Dictionary<string,Dictionary<string,List<string>>>
{
    {
        "India", new Dictionary<string, List<string>> 
                    {
                        {"TA", new List<string> {"City1", "City2", "City3"}},
                    }
    },
    {
        "USA", new Dictionary<string, List<string>> 
                    {
                        {"WI", new List<string> {"City1", "City3"}},
                        {"DC", new List<string> {"City1"}}
                    }
    }
};
var result = m1.Keys.Intersect(m2.Keys)
                    .ToDictionary(k => k, k => m1[k].Keys.Intersect(m2[k].Keys)
                        .ToDictionary(l => l, l => m1[k][l].Intersect(m2[k][l])));