LINQ в C#: операции над множествами

Множество (Set) на языке — это структура данных, представляющая собой не организованный набор уникальных элементов одного типа. Так, под общим названием «операции над множествами в LINQ» подразумеваются такие операции запросов, результирующие наборы которых основываются на наличии или отсутствии эквивалентных элементов в одной или другой коллекции (или наборе).

Метод Distinct

Distinct — удаляет повторяющиеся значения из коллекции. Например,

int[] numbers = { 1, 2, 3, 2, 4, 1};
var dist = numbers.Distinct();
foreach (int x in dist)
    Console.Write($"{x} ");
1 2 3 4

Как и при использовании метода 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
Измерение №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
О том, как можно переопределить метод Equals — см. здесь. О том, что такое переопределение методов мы говорили здесь.

Метод 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} ");

Вернет

3

Если поменять массивы местами:

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} ");

то получим:

5 7

Метод 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} ");
1 2 4

Метод 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 можно удалять из коллекций одинаковые элементы, получать объединение, пересечение и разность двух коллекций.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии