Полное руководство по языку программирования С# 14 и платформе .NET 10 / LINQ

Объединение, пересечение и разность коллекций

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

LINQ предоставляет несколько методов для работы с коллекциями как с множествами, а именно находить их разность, объединение и пересечение.

Разность последовательностей

С помощью метода Except() можно получить разность двух последовательностей:


string[] soft = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// разность последовательностей
var result = soft.Except(hard);

foreach (string s in result)
    Console.WriteLine(s);

В данном случае из массива soft убираются все элементы, которые есть в массиве hard. Результатом операции будут два элемента:

Microsoft
Google

Пересечение последовательностей

Для получения пересечения последовательностей, то есть общих для обоих наборов элементов, применяется метод Intersect:


string[] soft = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// пересечение последовательностей
var result = soft.Intersect(hard);

foreach (string s in result)
    Console.WriteLine(s);

Так как оба набора имеют только один общий элемент, то соответственно только он и попадет в результирующую выборку:

Apple

Удаление дубликатов

Для удаления дублей в наборе используется метод Distinct:


string[] soft = { "Microsoft", "Google", "Apple", "Microsoft", "Google" };

// удаление дублей
var result = soft.Distinct();

foreach (string s in result)
    Console.WriteLine(s);
Microsoft
Google
Apple

Объединение последовательностей

Для объединения двух последовательностей используется метод Union. Его результатом является новый набор, в котором имеются элементы, как из первой, так и из второй последовательности. Повторяющиеся элементы добавляются в результат только один раз:


string[] soft = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// объединение последовательностей
var result = soft.Union(hard);

foreach (string s in result)
    Console.WriteLine(s);

Результатом операции будет следующий набор:

Microsoft
Google
Apple
IBM
Samsung

Если же нам нужно простое объединение двух наборов, то мы можем использовать метод Concat:


var result = soft.Concat(hard);

В этом случае те элементы, которые встречаются в обоих наборах, дублируются в резутирующей последовательности.

Последовательное применение методов Concat и Distinct будет подобно действию метода Union.

Работа со сложными объектами

Для сравнения объектов в последовательностях применяются реализации методов GetHeshCode() и Equals(). Поэтому если мы хотим работать с последовательностями, которые содержат объекты своих классов и структур, то нам необходимо определить для них подобные методы:


Person[] students = { new Person("Tom"), new Person("Bob"), new Person("Sam") };
Person[] employees = { new Person("Tom"), new Person("Bob"), new Person("Mike") };

// объединение последовательностей
var people = students.Union(employees);

foreach (Person person in people)
    Console.WriteLine(person.Name);


class Person
{
    public string Name { get;}
    public Person(string name) => Name = name;

    public override bool Equals(object? obj)
    {
        if (obj is Person person) return Name == person.Name;
        return false;
    }
    public override int GetHashCode() => Name.GetHashCode();
}

Здесь объекты Person сравниваются исходя из значения их свойства Name - если имена равны, то и объекты Person равны. Консольный вывод:

Tom
Bob
Sam
Mike

Проверь себя

📋 Тест по теме «Объединение, пересечение и разность коллекций» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string[] _____ = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// разность последовательностей
var result = soft.Except(hard);

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string[] soft = { "_____", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// пересечение последовательностей
var result = soft.Intersect(hard);

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string[] soft = { "Microsoft", "_____", "Apple", "Microsoft", "Google" };

// удаление дублей
var result = soft.Distinct();

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

string[] soft = { "Microsoft", "Google", "_____"};
string[] hard = { "Apple", "IBM", "Samsung"};

// объединение последовательностей
var result = soft.Union(hard);

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

var _____ = soft.Concat(hard);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

string[] soft = { "_____", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// разность последовательностей
var result = soft._____(hard);

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

string[] soft = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "_____", "Samsung"};

// пересечение последовательностей
var result = soft.Intersect(hard);

foreach (string s in result)
    Console._____(s);
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

string[] soft = { "Microsoft", "Google", "Apple"};
// разность последовательностей
string[] hard = { "Apple", "IBM", "Samsung"};
var result = soft.Except(hard);
foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Объединение, пересечение и разность коллекций»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Объединение, пересечение и разность коллекций», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

string[] soft = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// разность последовательностей
var result = soft.Except(hard);

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Объединение, пересечение и разность коллекций»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

string[] soft = { "Microsoft", "Google", "Apple"};
string[] hard = { "Apple", "IBM", "Samsung"};

// пересечение последовательностей
var result = soft.Intersect(hard);

foreach (string s in result)
    Console.WriteLine(s);
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Объединение, пересечение и разность коллекций»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Объединение, пересечение и разность коллекций»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Объединение, пересечение и разность коллекций». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.