在字典中查找重复值并打印重复元素的键

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

【讨论】:

以上是关于在字典中查找重复值并打印重复元素的键的主要内容,如果未能解决你的问题,请参考以下文章

如何打印除dict中的键之外的所有键的值[重复]

python中怎么重复打印

以pythonic方式打印字典中最大值的键[重复]

在 XML 中查找重复值并在 XSL 中删除节点

查找字典的最大值并打印键、值对[重复]

在字典中查找元素并检查对象的类型[重复]