Множество (Set
) на языке — это структура данных, представляющая собой не организованный набор уникальных элементов одного типа. Так, под общим названием «операции над множествами в LINQ» подразумеваются такие операции запросов, результирующие наборы которых основываются на наличии или отсутствии эквивалентных элементов в одной или другой коллекции (или наборе).
Метод Distinct
Distinct
— удаляет повторяющиеся значения из коллекции. Например,
int[] numbers = { 1, 2, 3, 2, 4, 1}; var dist = numbers.Distinct(); foreach (int x in dist) Console.Write($"{x} ");
Как и при использовании метода Contains, если необходимо удалить повторяющиеся объекты, то для таких объектов необходимо переопределить методы Equals
/GetHashCode
. Например, код представленный ниже, не удалит дубликаты из списка:
List<DataObject> objects = new List<DataObject>() { new DataObject {Name = "Измерение №1", Value = 12.5, Date = DateTime.Now }, new DataObject {Name = "Измерение №1", Value = 12.5, Date = DateTime.Now }, new DataObject {Name = "Измерение №3", Value = 80.5, Date = DateTime.Now.AddMonths(1) }, new DataObject {Name = "Измерение №4", Value = 11.3, Date = DateTime.Now.AddDays(7) }, new DataObject {Name = "Измерение №5", Value = 10.7, Date = DateTime.Now.AddHours(2.5) } }; var result = objects.Distinct(); foreach (DataObject data in result) Console.WriteLine(data.ToString());
Измерение №1 12,5 02.11.2021 20:26:49
Измерение №3 80,5 02.12.2021 20:26:49
Измерение №4 11,3 09.11.2021 20:26:49
Измерение №5 10,7 02.11.2021 22:56:49
Метод Except
Метод Except
в LINQ возвращает множество, представляющее собой коллекцию, содержащую такие элементы, которые отсутствуют во второй коллекции, например:
int[] numbers = { 1, 2, 3, 2, 4, 1}; int[] numbers2 = { 1, 2, 5, 2, 4, 7 }; var except = numbers.Except(numbers2); foreach (int x in except) Console.Write($"{x} ");
Вернет
Если поменять массивы местами:
int[] numbers = { 1, 2, 3, 2, 4, 1}; int[] numbers2 = { 1, 2, 5, 2, 4, 7 }; var except = numbers2.Except(numbers); foreach (int x in except) Console.Write($"{x} ");
то получим:
Метод Intersect
Метод Intersect
в LINQ возвращает пересечение коллекций, т. е. элементы, присутствующие в каждой из двух коллекций:
int[] numbers = { 1, 2, 3, 2, 4, 1}; int[] numbers2 = { 1, 2, 5, 2, 4, 7 }; var except = numbers.Intersect(numbers2); foreach (int x in except) Console.Write($"{x} ");
Метод Union
Метод Union
в LINQ возвращает объединение множеств, т. е. уникальные элементы, присутствующие в одной из двух коллекций:
string[] strings1 = { "Пиво", "Вино", "Водка", "Вермут" }; string[] strings2 = { "Пиво", "Сок", "Абсент", "Водка" }; var result = strings1.Union(strings2); foreach (var str in result) { Console.WriteLine(str); }
Вино
Водка
Вермут
Сок
Абсент
Итого
Сегодня мы рассмотрели основные операции над множествами в LINQ C#: Distinct
, Except
, Intersect
, Union
. С помощью этих методов расширения LINQ можно удалять из коллекций одинаковые элементы, получать объединение, пересечение и разность двух коллекций.