0Pricing
C# Academy · Урок

Элемент распространения

Объединяйте коллекции с помощью оператора распространения.

«Элемент распространения» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Синтаксис выражений коллекций
  2. Элемент распространения
  3. Вывод типа коллекций по контексту
  4. Построители коллекций
← Назад к C# Academy