Поиск повторяющихся значений в словаре и печать ключа дублирующего элемента - PullRequest
9 голосов
/ 24 августа 2011

Каким может быть самый быстрый способ проверить повторяющиеся значения в словаре и напечатать его ключ?

Словарь MyDict, имеющий следующие значения,

Ключ Значение

22 * ​​1012 * 100

24 200

25 100

26 300

29 200

39 400

41 500

Пример: ключи 22 и 25 имеют одинаковые значения, и мне нужно напечатать, что 22 и 25 имеют повторяющиеся значения.

Ответы [ 2 ]

23 голосов
/ 24 августа 2011

Это зависит.Если у вас есть постоянно меняющийся словарь и вам нужно получить эту информацию только один раз, используйте это:

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);
}
5 голосов
/ 24 августа 2011

для образца

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