C# 查找不同字典值变量的交集

C# 查找不同字典值变量的交集,c#,dictionary,set-intersection,C#,Dictionary,Set Intersection,我有一本字典声明为type var dictionary1 = Dictionary<string, Type1> 还包括: dictionary2["key"].classid = 100 我知道它们有不同的类型,但是有没有一种内在的方法来找到这两个私有变量的交集,并可能返回给我一个单一类型的字典?因此,如果classid是等效的,我可以得到Dictionary1类型的交叉字典?这不是最优雅的查询,但它应该可以做到: var intersection = dictionary1

我有一本字典声明为type

var dictionary1 = Dictionary<string, Type1>
还包括:

dictionary2["key"].classid = 100

我知道它们有不同的类型,但是有没有一种内在的方法来找到这两个私有变量的交集,并可能返回给我一个单一类型的字典?因此,如果classid是等效的,我可以得到Dictionary1类型的交叉字典?

这不是最优雅的查询,但它应该可以做到:

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匹配。然后将这些键值对转换为新的字典。

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

        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));
Dictionary t=newdictionary();
字典t1=新字典();
t、 添加(100,“f”);
t1.添加(100,“f2”);
var abc=t.Where(p=>t1.Any(q=>q.Key==p.Key));

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

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

作为替代,您也可以使用简单的
连接
,对于较大的数据集,它更可读且(可能)更快:

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

如果需要在类外使用,为什么
classid
是私有的?等等,如果
classid
是私有的
dictionary1[“key”]。classid=100
不会编译。这不是我的私人错误。所以您想要
字典1
的所有元素,其中值的
classid
也可以在
字典2
的值中找到?钥匙要匹配吗?我不太清楚。也许您应该给出一些输入/输出示例。@user2281557很高兴听到。如果这对您有帮助,请不要忘记使用左侧的复选标记图标将答案标记为已接受。您也可以使用
TryGetValue
而不是
ContainsKey(key)
然后再使用
dictionary[key]
查找:每次迭代查找一次应该比两次快。@LukeH这是真的,但是,在C#6能够将变量声明为
out
方法调用的一部分之前,这将需要将lambda表达式分解为一个满标度{}覆盖的块范围,这很难看。
        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));
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);