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
。