在字典中查找重复值并打印重复元素的键
Posted
技术标签:
【中文标题】在字典中查找重复值并打印重复元素的键【英文标题】:Finding duplicate values in dictionary and print Key of the duplicate element 【发布时间】:2011-11-02 14:20:17 【问题描述】:检查字典中的重复值并打印其键的最快方法是什么?
字典MyDict
具有以下值,
关键价值
22 100
24 200
25 100
26 300
29 200
39 400
41 500
示例:键 22 和 25 具有相同的值,我需要打印 22 和 25 具有重复值。
【问题讨论】:
【参考方案1】:这取决于。 如果您有一本不断变化的字典,并且只需要获取一次该信息,请使用:
MyDict.GroupBy(x => x.Value).Where(x => x.Count() > 1)
但是,如果您的字典或多或少是静态的,并且需要多次获取此信息,则不应只将数据保存在字典中,还应保存在 ILookup
中,字典的值为将字典的键和键作为值:
var lookup = MyDict.ToLookup(x => x.Value, x => x.Key).Where(x => x.Count() > 1);
要打印信息,您可以使用以下代码:
foreach(var item in lookup)
var keys = item.Aggregate("", (s, v) => s+", "+v);
var message = "The following keys have the value " + item.Key + ":" + keys;
Console.WriteLine(message);
【讨论】:
字典只会在我调用一个函数时创建一次,并且在该特定调用中字典不会发生任何变化。你能告诉我如何打印重复值的键..这本字典对我来说是新的..谢谢。 @丹尼尔:我想我把你弄糊涂了。我需要一条消息,例如“以下键具有重复值:22 和 25”。我无法理解您的代码如何比较并找到重复值。当我使用您的代码时,它只是打印查找的每个键和值。 @Sangram:不,它没有。它只打印那些具有相同值的键。请再检查一次。但是,在我的答案中有一小段时间 代码将返回所有键。也许你测试了这个奇怪的机会?您创建查找的代码需要如下所示:var lookup = MyDict.ToLookup(x => x.Value, x => x.Key).Where(x => x.Count() > 1);
。注意末尾的Where(...)
部分。
@丹尼尔:是的。你是对的。它现在可以工作了。早期代码在查找中存在一些问题。它现在工作。万分感谢。我有一个问题。你是如何比较两个元素的?通过使用 (x => x.Value, x => x.Key).Where(x => x.Count() > 1) ??你一定看过斯科特的回答。那是另一个正确答案。但是我可以说你的方法更快吗?我想是的。
Scotts 的回答和我的第一个回答一样。他只是使用查询语法,而我使用方法链语法。他的版本被编译器转换成我的版本,所以它们是一样的。比较是在ToLookup
内部自动完成的。【参考方案2】:
样品
static void Main(string[] args)
Dictionary<int, int> dic = new Dictionary<int, int>();
dic.Add(1, 1);
dic.Add(2, 4);
dic.Add(3, 1);
dic.Add(4, 2);
var result = from p in dic
group p by p.Value into g
where g.Count() > 1
select g;
foreach (var r in result)
var sameValue = (from p in r
select p.Key + "").ToArray();
Console.WriteLine("0 has the same value 1:",
string.Join("," , sameValue) , r.Key);
Console.ReadKey();
【讨论】:
以上是关于在字典中查找重复值并打印重复元素的键的主要内容,如果未能解决你的问题,请参考以下文章