Элемент распространения
Объединяйте коллекции с помощью оператора распространения.
«Элемент распространения» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Элемент распространения ..
Внутри выражения коллекции элемент распространения .. вставляет содержимое другой коллекции. Так декларативно объединяются последовательности.
using System;
int[] a = [1, 2, 3];
int[] b = [4, 5, 6];
int[] all = [..a, ..b];
Console.WriteLine(string.Join(",", all)); // 1,2,3,4,5,6Сочетание элементов распространения и отдельных элементов
Элементы распространения можно свободно чередовать с отдельными значениями, при этом порядок сохраняется.
using System;
int[] middle = [2, 3, 4];
int[] result = [1, ..middle, 5];
Console.WriteLine(string.Join(",", result)); // 1,2,3,4,5Добавление в начало и конец
Элементы распространения упрощают добавление в начало или конец, создавая новую коллекцию вместо изменения исходной.
using System;
int[] core = [10, 20, 30];
int[] withHead = [0, ..core];
int[] withTail = [..core, 40];
Console.WriteLine(string.Join(",", withHead)); // 0,10,20,30
Console.WriteLine(string.Join(",", withTail)); // 10,20,30,40Распространение нескольких источников
В одну коллекцию можно распространить любое количество коллекций. Так несколько списков объединяются в одном выражении.
using System;
using System.Collections.Generic;
List<string> x = ["a", "b"];
List<string> y = ["c"];
List<string> z = ["d", "e"];
List<string> merged = [..x, ..y, ..z];
Console.WriteLine(string.Join(",", merged)); // a,b,c,d,eРаспространение коллекций разных типов
Источник распространения может быть любым перечисляемым объектом: массив можно распространить в список, список — в массив и так далее. Тип результата определяется целевым типом.
using System;
using System.Collections.Generic;
int[] arr = [1, 2];
List<int> list = [3, 4];
int[] combined = [..arr, ..list];
Console.WriteLine(string.Join(",", combined)); // 1,2,3,4Распространение IEnumerable
Можно распространять даже ленивые последовательности из LINQ: они перечисляются при создании новой коллекции.
using System;
using System.Linq;
var evens = Enumerable.Range(1, 6).Where(n => n % 2 == 0);
int[] result = [0, ..evens];
Console.WriteLine(string.Join(",", result)); // 0,2,4,6Построение коллекций
Элементы распространения отлично подходят для поэтапного построения коллекции без императивных вызовов Add.
using System;
int[] baseline = [1, 2, 3];
int[] extra = [4, 5];
int[] full = [..baseline, ..extra, 6];
Console.WriteLine(full.Length); // 6Порядок имеет значение
Итоговая последовательность следует текстовому порядку элементов и элементов распространения, поэтому перестановка элементов распространения меняет результат.
using System;
int[] a = [1, 2];
int[] b = [3, 4];
Console.WriteLine(string.Join(",", [..a, ..b])); // 1,2,3,4
Console.WriteLine(string.Join(",", [..b, ..a])); // 3,4,1,2Элементы распространения и Concat
Элементы распространения часто заменяют комбинацию Concat + ToArray. Код с ними читается понятнее, а компилятор может эффективно определить размер результата.
using System;
using System.Linq;
int[] a = [1, 2];
int[] b = [3, 4];
// old
int[] oldWay = a.Concat(b).ToArray();
// new
int[] newWay = [..a, ..b];
Console.WriteLine(oldWay.SequenceEqual(newWay)); // TrueРаспространение в диапазоны
Поскольку целевым типом может быть диапазон, можно объединять данные с потенциальным выделением памяти в стеке для производительных участков кода.
using System;
ReadOnlySpan<int> head = [1, 2];
ReadOnlySpan<int> tail = [3, 4];
int[] joined = [..head, ..tail];
Console.WriteLine(string.Join(",", joined)); // 1,2,3,4Практическое объединение
Здесь мы объединяем параметры по умолчанию с переопределениями в одном выражении, сохраняя значения, указанные после параметров по умолчанию.
using System;
string[] defaults = ["--verbose", "--color"];
string[] userArgs = ["--output=log.txt"];
string[] finalArgs = [..defaults, ..userArgs];
Console.WriteLine(string.Join(" ", finalArgs));Быстрая проверка
Проверьте, насколько хорошо Вы поняли элемент распространения.
Итоги
Вы изучили элемент распространения .. внутри выражений коллекций.
[..a, ..b]объединяет коллекции.- Элементы распространения можно сочетать с отдельными элементами, сохраняя порядок.
- Источниками могут быть массивы, списки, диапазоны или любой
IEnumerable. - Это более понятная альтернатива
Concat().ToArray().
Часто задаваемые вопросы
Урок «Элемент распространения» бесплатный?
Да — полный текст урока «Элемент распространения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Элемент распространения»?
Объединяйте коллекции с помощью оператора распространения. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Элемент распространения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Синтаксис выражений коллекций
- Элемент распространения
- Вывод типа коллекций по контексту
- Построители коллекций