Сейчас работаем

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

На собеседованиях часто просят решить следующую задачу. Написать метод, который будет возвращать true, если в коллекции (массиве) есть хотя-бы один повторяющий элемент. Метод должен уметь работать с любыми типами данных (например int, string, MyClass). Причем ограничений по версии .NET нам не ставят, поэтому мы с легкостью можем использовать технологию LINQ. Данную задачу можно решить двумя путями: 

  • посчитать сколько всего элементов в коллекции и посчитать сколько уникальных элементов, если количество не совпадает, то возвращать true (используем Distinct)
  • сгруппировать элементы коллекции и если хотя бы в одной группе количество элементов больше одного, то вернуть true (используем GroupBy)

Давайте напишем класс, который будет реализовывать четыре метода один дженерик один частный на каждый из вариантов решения

public static class CollectionExtensions
{
	/// <summary>
	/// Решение для коллекции чисел с помощью Distinct
	/// </summary>
	/// <param name="collection"></param>
	/// <returns></returns>
	public static bool HasDuplicatesUseDistinct(this IEnumerable<int> collection)
	{
		return collection.Count() != collection.Distinct().Count();
	}

	/// <summary>
	/// Решение для коллекции чисел с помощью GroupBy
	/// </summary>
	/// <param name="collection"></param>
	/// <returns></returns>
	public static bool HasDuplicatesUseGroupBy(this IEnumerable<int> collection)
	{
		return collection
			.GroupBy(x => x)
			.Any(x => x.Count() > 1);
	}

	/// <summary>
	/// Generic решение с помощью Distinct. Требует дополнительного параметра для классов и структур
	/// </summary>
	/// <typeparam name="T"></typeparam>
	/// <param name="collection"></param>
	/// <param name="comparer"></param>
	/// <returns></returns>
	public static bool HasDuplicatesUseDistinctGeneric<T>(this IEnumerable<T> collection, IEqualityComparer<T> comparer = null)
	{
		return collection.Count() != (comparer == null ? collection.Distinct().Count() : collection.Distinct(comparer).Count());
	}

	/// <summary>
	/// Generic решение с помощью Distinct. Требует дополнительного параметра для классов и структур
	/// </summary>
	/// <typeparam name="T"></typeparam>
	/// <param name="collection"></param>
	/// <returns></returns>
	public static bool HasDuplicatesUseGroupByGeneric<T>(this IEnumerable<T> collection, IEqualityComparer<T> comparer = null)
	{
		return collection
			.GroupBy(x => x, comparer)
			.Any(x => x.Count() > 1);
	}
}

Вот-так можно пользоваться этими расширениями

int[] numbers = new int[] { 1, 2, 3, 2 };
string[] words = new string[] { "tree", "car", "house", "developer", "car" };
Car[] cars = new Car[] { new Car("bmw", 92), new Car("daewoo", 54), new Car("bMw", 92) };

Console.WriteLine(numbers.HasDuplicatesUseDistinct());
Console.WriteLine(numbers.HasDuplicatesUseGroupBy());

Console.WriteLine(cars.HasDuplicatesUseDistinctGeneric(new CarComparer()));
Console.WriteLine(cars.HasDuplicatesUseGroupByGeneric(new CarComparer()));

Console.WriteLine(words.HasDuplicatesUseDistinctGeneric());
Console.WriteLine(words.HasDuplicatesUseGroupByGeneric());

Готовое решение доступно по нажатию "скачать бесплатно". Проект использует Visual Studio 2015

Комментарии (0)

dmytro

/ /

Оставить комментарий

Ты не можешь комментировать

Только зарегистрированые пользователи имеют возможность комментировать работы
Другие работы автора
Тип Название Рейтинг Категория Стоимость
Курсовая C++ cловесный эквивалент числа 18 C/C++ бесплатно
Курсовая MP3 плеер на C# 24 .NET (C#) 2 500,00
Курсовая Актуальные проблемы подростковой субкультуры 8 Теория игр 7,00
Курсовая Визуализатор графиков на WinApi 11 C/C++ 500,00
Статья Генерация случайных чисел на C# или класс Random под микроскопом 33 .NET (C#) 500,00
Новые работы
Тип Название Рейтинг Категория Стоимость
Исходник Учет продаж (NET 5.0, C#, WPF, SQL Server) new 0 .NET (C#) 1 000,00
Исходник Стековый калькулятор C# new 0 .NET (C#) 700,00
Курсовая Автоматизированная информационная система «Поиск пропавших людей» C# new 0 .NET (C#) 2 500,00
Курсовая Распределение учебной нагрузки C# new 0 .NET (C#) 5 000,00
Исходник Нахождение кратчайшего пути в графе. Алгоритм Дейкстры C# new 0 .NET (C#) 600,00
Поиск дубликатов C#
Написать метод, который будет возвращать true, если в коллекции (массиве) есть хотя-бы один повторяющий элемент. Метод должен уметь работать с любыми типами данных (например int, string, MyClass)
Категория: Образование
Стоимость: Бесплатно