Когда коллекция растет, руками гонять двойные циклы для поиска дубликатов уже не хочется. В .NET это хорошо решается комбинацией
LINQ и HashSet, плюс классическими GroupBy и Distinct.• LINQ Any и HashSet
Идея простая: HashSet хранит только уникальные элементы. Метод
Add возвращает false если такое значение уже было. Значит можно пробежать коллекцию через Any и остановиться на первом дубликате:public static bool HasDuplicatesAny<T>(IEnumerable<T> source)
{
HashSet<T> seen = new();
return source.Any(item => !seen.Add(item));
}
Метод возвращает
true как только встретится элемент который не удалось добавить в набор.• LINQ GroupBy и Count 1
Если нужны сами дубликаты, а не только факт их наличия, помогает
GroupBy. Мы группируем по значению и фильтруем группы в которых больше одного элемента:public static IEnumerable<T> GetDuplicatesGroupBy<T>(IEnumerable<T> source)
{
return source
.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
}
• LINQ Distinct и подсчет элементов
Иногда достаточно проверить есть ли дубликаты, не вытаскивая их. Тогда можно сравнить размер исходной коллекции и количества уникальных элементов после
Distinct:public static bool HasDuplicatesDistinct<T>(IEnumerable<T> source)
{
int total = source.Count();
int unique = source.Distinct().Count();
return unique != total;
}
Для быстрых проверок чаще всего хватает
Any + HashSet. GroupBy удобно когда нужны сами дубликаты.📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view