⚙️
Поиск дубликатов с LINQКогда коллекция растет, руками гонять двойные циклы для поиска дубликатов уже не хочется. В .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