【问题标题】:Find intersect of different dictionary values variable查找不同字典值变量的交集
【发布时间】:2014-07-03 14:47:15
【问题描述】:

我有一个字典声明为类型

var dictionary1 = Dictionary<string, Type1>

另一个是

var dictionary2 = Dictionary<string, Type2>

每个字典值类型都有一个名为 classid 的公共变量,所以:

dictionary1["key"].classid = 100

也在:

dictionary2["key"].classid = 100

我知道它们是不同类型的,但是有没有一种内置的方法可以找到这两个私有变量的交集并可能返回一个单一类型的字典?所以如果classid是等价的,我可以得到一个类型为Dictionary1的相交字典?

【问题讨论】:

  • 如果需要在课外使用,为什么classid是私有的?
  • 等一下,如果 classid 是私有的 dictionary1["key"].classid = 100; 将无法编译。
  • 我的错误并不是要保密。
  • 所以你想要dictionary1 的所有元素,其中classid 的值也在dictionary2 的值中找到?到键必须匹配?不完全清楚恕我直言。也许你应该给出一些示例输入/输出。

标签: c# dictionary set-intersection


【解决方案1】:

这不是最优雅的查询,但应该可以解决问题:

var intersection = dictionary1
.Where(kvp1 => 
   dictionary2.ContainsKey(kvp1.Key) 
   && dictionary2[kvp1.Key].classid = kvp1.Value.classid)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

这应该获取 dictionary1 中的所有键值对,其键也存在于 dictionary2 中,并且其 classid 与 dictionary2 对象的 classid 匹配。然后将这些键值对转换为新字典。

【讨论】:

  • @user2281557 很高兴听到。如果这对您有所帮助,请不要忘记使用左侧的复选标记图标将答案标记为已接受。
  • 您也可以使用TryGetValue 而不是ContainsKey(key) 后跟dictionary[key] 查找:每次迭代查找一次应该比两次查找快。
  • @LukeH 确实如此,但在 C# 6 出现将变量声明为 out 方法调用的一部分的能力之前,这需要将 lambda 表达式分解为完整的 {}-覆盖块范围,这很丑。
【解决方案2】:

作为Where/ContainsKey 的替代方案,您还可以使用简单的join,它对于更大的数据集更具可读性并且(可能)更快:

var result = from kv1 in dictionary1
             join kv2 in dictionary2 on 
                new {kv1.Key, kv1.Value.classid} equals 
                new {kv2.Key, kv2.Value.classid}
             select kv1;

var new_dict = result.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

【讨论】:

    【解决方案3】:

    你可以使用下面提到的代码

            Dictionary<int, string> t = new Dictionary<int, string>();
            Dictionary<int, string> t1 = new Dictionary<int, string>();
            t.Add(100, "f");
            t1.Add(100, "f2");
    
            var abc=t.Where(p=>t1.Any(q=>q.Key==p.Key));
    

    【讨论】:

      【解决方案4】:

      是的,但字典可能不是您想要的,而且这个问题可能是重复的,措辞不同:

      C# Linq intersect/except with one part of object

      顺便说一句,您要用于交叉路口的属性应该是公共的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2012-11-09
        相关资源
        最近更新 更多