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