C# 按值比较两个字典的条目,然后返回各自的键?

C# 按值比较两个字典的条目,然后返回各自的键?,c#,linq,dictionary,intersect,C#,Linq,Dictionary,Intersect,我有两个类型为Dictionary的字典,第一个int是它们的键,(int,int)是它们的值 使用var crossions=dict1.Values.Intersect(dict2.Values)我可以比较值并返回两个值之间一致的所有值的IEnumerable,但是这并没有给我键。使用var crossions=dict1.Keys.Intersect(dict2.Keys)将返回出现在两个字典中的键,即。。。每一个键,因为键只从1开始,每个条目递增1,所以它是无用的 我想通过它们的值来比较

我有两个类型为
Dictionary
的字典,第一个
int
是它们的键,
(int,int)
是它们的值

使用
var crossions=dict1.Values.Intersect(dict2.Values)我可以比较值并返回两个值之间一致的所有值的IEnumerable,但是这并没有给我键。使用
var crossions=dict1.Keys.Intersect(dict2.Keys)将返回出现在两个字典中的键,即。。。每一个键,因为键只从1开始,每个条目递增1,所以它是无用的

我想通过它们的值来比较条目,然后访问它们的键。例如,如果条目(12,36)出现在
dict1
中的键20和
dict2
中的键45处,我希望有一种访问20和45的方法

我完全不知所措。我能比较值和返回值,我能比较键和返回键,但我不能比较值和返回键。怎么办

谢谢

dict1.Union(dict2)
    .GroupBy(kvp => kvp.Value)
    .Where(g => g.Count() > 1) // but this doesn't account for equal values in same dictionary if that's important
    .Select(g => new
    {
        Value = g.Key,
        Keys = g.Select(kvp => kvp.Key),
    });

或者,您可以加入每个字典的
KeyValuePair
对象的
Value
属性。

您可以创建自己的IEqualityComparer,并使用请求它的Intersect重载

static void Main(字符串[]args)
{
var dict1=新字典();
第1条加入(1,(1,1));
第1条加入(2,(2,2));
第1条加入(3,(3,3));
var dict2=新字典();
第2条加入(4,(2,2));
第2条加入(5,(3,3));
第2条加入(6,(4,4));
var intersection=dict1.Intersect(dict2,新的eq());
foreach(交叉口中的变量i)
WriteLine($“Key:{i.Key},Value:{i.Value}”);
Console.ReadLine();
}
等级eq:IEqualityComparer
{
公共布尔等于(键值对x、键值对y)
{
返回x.值==y.值;
}
public int GetHashCode(KeyValuePair obj)
{
未经检查
{
int hash=17;
hash=hash*23+obj.Value.Item1;
hash=hash*23+obj.Value.Item2;
返回散列;
}
}
}
键:2,值:(2,2)
键:3,值:(3,3)


来自Jon Skeet的散列

您只需使用
Where
过滤器,并检查其他字典是否包含以下值:

var matches = dict1.Where(d => dict2.ContainsValue(d.Value));
这将返回一个枚举,然后您可以根据需要使用
ToDictionary()
ToList()

编辑:

使用此
联合
返回匹配的两侧:

dict1.Where(d => dict2.ContainsValue(d.Value))
     .Union(dict2.Where(d => dict1.ContainsValue(d.Value)));

HTH

描述您试图解决的问题,而不是描述您对无法实现的问题的解决方案。任何值是否不可能在任一字典中出现多次?字典的值不保证是唯一的。那么,考虑到这两个字典可能已经匹配了重复的值,intersect操作的预期输出是什么?例如,
dict1:{{1=>“A”},{2=>“A”}
dict2:{{11=>“A”},{12=>“A”}
。输出应将值
“A”
与第一个字典的键
1、2和第二个字典的键
11、12相关联。你想要一个
字典类型的输出吗?哦,这几乎是完美的!不过,这看起来也在比较键,而我只想比较值,然后返回附加到它的键。在您的示例中,如果(2,2)在dict1中设置为键2,但在dict2中设置为键5,我仍然希望找到这对,并获得2+5作为结果。@SebC阅读注释表明intersect不正确。也许需要更多的工作。。。我会考虑的it@SebC这应该按预期工作。看这把小提琴:似乎是最好的选择是的,对于一个小样品来说效果很好,非常感谢!)对于更大的样本(发现了数千个匹配项),这似乎冻结了一切,虽然可能只是花了太多时间来计算,但实际上看起来像是冻结。。这个var变成了什么样的变量?它只是说“(局部变量)?”。如果不知道我使用的是哪种变量,在将结果发送到foreach之前很难只过滤出一部分结果(我正在寻找其中较小的键)。更新:在大约10分钟的计算后解冻。但我确实得到了我想要的名单,所以非常感谢大家的帮助!:)定义
键时,您可能需要使用
ToList