22 мая 2012 г.

Поиск дубликатов

На одном из собеседований на работу задали мне задачу, несложную такую задачу, но сразу код я написать не смог. Написал уже дома.
Итак задача: есть у вас массив чисел (предположим целочисленный массив). Все числа в нем разные, но нектороые числа имеют дубликаты. Как найти эти числа?

Интуитивно я понял, что для решения этой задачи необходимо использовать LINQ. И вот кусок кода, решающий эту задачу:
int[] array = new int[]{1,2,3,4,5,6,7,8,9,0,4};
var result = array
    // группируем по ключу.
    // в данном случае ключ
    // и есть наши числа
    .GroupBy(key => key)
    // выбираем те группы,
    // число элементов в которых больше 1
    .Where(gr => gr.Count() > 1)
    // выбираем ключи (числа).
    // определить их местоположение - дело техники
    .Select(gr => gr.Key);

foreach (var item in result)
{
    Console.WriteLine(item);
}
Кому нравится LINQ в виде запроса можно сделать так:
var result = from num in array
             group num by num into newgroup
             where newgroup.Count() > 1
             select newgroup.Key;