Как определить дубликаты в коллекции целых? - PullRequest
6 голосов
/ 27 июня 2011

Допустим, у меня есть следующие значения в коллекции целых чисел:

{1,3,4,5,5,6,7,7}

Ожидаемый результат: {5,7}.

Как я могу это сделать?Может быть, с помощью LINQ?

EDIT: Входная коллекция не отсортирована, поэтому алгоритм не должен полагаться на повторяющиеся дубликаты.Кроме того, не имеет значения, отсортирована ли полученная дублирующаяся коллекция или нет.

Ответы [ 7 ]

8 голосов
/ 27 июня 2011

Вы можете сделать это с помощью встроенной функциональности LINQ, и она работает на провайдерах LINQ, таких как LINQ to SQL, EF и NHibernate:

var dups = collection.GroupBy(x => x)
                     .Where(g => g.Count() > 1)
                     .Select(g => g.Key);
6 голосов
/ 27 июня 2011

Как насчет:

public static IEnumerable<T> OnlyDupes<T>(this IEnumerable<T> source)
{
    var seen = new HashSet<T>();
    foreach (var item in source)
    {
        // HashSet<T>.Add returns: true if the element is added to the
        // HashSet<T> object; false if the element is already present.
        if (!seen.Add(item)) yield return item;
    }
}
3 голосов
/ 27 июня 2011
var list = new List<int>(){1,3,4,5,5,6,7,7};

var query = ( from i in list
               group i by i into g
               where g.Count() > 1
               select g.Key).ToList();    
3 голосов
/ 27 июня 2011

Попробуйте что-то вроде этого:

int[] listOfItems = new[] { 4, 2, 3, 1, 6, 4, 3 };
var duplicates = listOfItems
    .GroupBy(i => i)
    .Where(g => g.Count() > 1)
    .Select(g => g.Key);
foreach (var d in duplicates)
    Console.WriteLine(d);

из Поиск дубликатов с помощью LINQ

3 голосов
/ 27 июня 2011
var list = new List<int>() { 1, 3, 4, 5, 5, 6, 7, 7 };
var duplicates =  list.GroupBy(x => x)
                      .Where(g => g.Count() > 1)
                      .Select(g => g.Key)
                      .ToList();
2 голосов
/ 27 июня 2011

Linq с группой, имеющей счет покажет вам, как создать группу LINQ, имея счет> 1

В вашем конкретном случае:

var x = from i in new int[] { 1, 2, 2, 3 }
    group i by i into grp
    where grp.Count() > 1
    select grp.Key;
1 голос
/ 27 июня 2011

Используйте HashSet<T>, если вы используете .NET 3.5, или Iesi.Collections (NHibernate использует это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...