【问题标题】: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 具有重复值。

【问题讨论】:

    标签: c# collections dictionary compare duplicates


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 2023-03-13
      • 2021-04-03
      相关资源
      最近更新 更多