0Pricing
C# Academy · Урок

Тип Range и оператор ..

Получайте срезы с помощью выражений диапазона.

«Тип Range и оператор ..» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Знакомство с типом Range

System.Range описывает срез последовательности с помощью начального и конечного Index. Он идеально сочетается с оператором диапазона .., позволяя выразить подпоследовательности.

using System;

Range r = 1..3;
Console.WriteLine(r.Start + ".." + r.End); // 1..3

Оператор .. (диапазон)

Оператор диапазона a..b создаёт Range от индекса a включительно до индекса b не включительно. Поэтому 1..3 охватывает позиции 1 и 2.

using System;

int[] data = { 10, 20, 30, 40, 50 };
int[] slice = data[1..3];
Console.WriteLine(string.Join(",", slice)); // 20,30

Начало включается, конец — нет

Исключительная конечная граница работает так же, как в циклах for: количество элементов равно end - start. Диапазон 2..5 возвращает три элемента.

using System;

int[] data = { 0, 1, 2, 3, 4, 5, 6 };
int[] slice = data[2..5];
Console.WriteLine(slice.Length);          // 3
Console.WriteLine(string.Join(",", slice)); // 2,3,4

Диапазоны без одной из границ

Любую из границ можно опустить. ..3 означает "от начала до 3", а 2.. — "от 2 до конца". Один оператор .. копирует всю последовательность.

using System;

int[] d = { 10, 20, 30, 40, 50 };
Console.WriteLine(string.Join(",", d[..3])); // 10,20,30
Console.WriteLine(string.Join(",", d[2..])); // 30,40,50
Console.WriteLine(string.Join(",", d[..]));  // 10,20,30,40,50

Диапазоны с индексами от конца

Объединяйте .. с ^, чтобы создавать срезы относительно конца. ^2.. означает "последние два элемента".

using System;

int[] d = { 1, 2, 3, 4, 5 };
Console.WriteLine(string.Join(",", d[^2..]));  // 4,5
Console.WriteLine(string.Join(",", d[..^1]));  // 1,2,3,4 (drop last)

Range как сохранённое значение

Range — это значение, которому можно присвоить имя и повторно использовать с разными коллекциями, использующими одинаковые правила определения длины.

using System;

Range middle = 1..^1; // drop first and last
int[] a = { 0, 1, 2, 3, 4 };
Console.WriteLine(string.Join(",", a[middle])); // 1,2,3

Range.GetOffsetAndLength

Чтобы вычислить диапазон относительно конкретной длины, вызовите GetOffsetAndLength(length). Он возвращает начальное смещение и длину среза, самостоятельно обрабатывая индексы с отсчётом от конца.

using System;

Range r = ^3..^1;
var (offset, length) = r.GetOffsetAndLength(5);
Console.WriteLine(offset + " " + length); // 2 2

Range.All

Статическое свойство Range.All эквивалентно .. и выбирает всю последовательность. Оно удобно при передаче диапазонов в качестве аргументов.

using System;

Range whole = Range.All;
int[] d = { 9, 8, 7 };
Console.WriteLine(string.Join(",", d[whole])); // 9,8,7

Явное создание Range

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

using System;

Range a = new Range(1, 3);
Range b = Range.StartAt(2);
Range c = Range.EndAt(2);
Console.WriteLine(a + " | " + b + " | " + c);

Пустые и недопустимые диапазоны

Диапазон, в котором начало совпадает с концом, создаёт пустой срез. Если после вычисления начало оказывается за концом, при создании среза возникает исключение.

using System;

int[] d = { 1, 2, 3, 4 };
Console.WriteLine(d[2..2].Length); // 0 (empty)
try { var _ = d[3..1]; }
catch (ArgumentOutOfRangeException) { Console.WriteLine("invalid range"); }

Объединяем всё вместе

Диапазоны делают обработку текста и массивов краткой. Здесь мы извлекаем участок в середине массива без каких-либо вычислений индексов.

using System;

int[] readings = { 5, 7, 9, 11, 13, 15 };
int[] window = readings[1..^1];
Console.WriteLine(string.Join(",", window)); // 7,9,11,13

Быстрая проверка

Убедитесь, что понимаете правила работы оператора диапазона.

Итоги

Вы узнали, что System.Range описывает срез с помощью оператора ...

  • Начало включается, конец не включается: количество = end - start.
  • Границы необязательны: ..3, 2.., ...
  • .. можно объединять с ^ для создания срезов с отсчётом от конца.
  • GetOffsetAndLength(length) преобразует диапазон в конкретные числа.

Часто задаваемые вопросы

Урок «Тип Range и оператор ..» бесплатный?

Да — полный текст урока «Тип Range и оператор ..» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Тип Range и оператор ..»?

Получайте срезы с помощью выражений диапазона. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Тип Range и оператор ..»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Тип Index и оператор ^
  2. Тип Range и оператор ..
  3. Диапазоны с массивами и строками
  4. Пользовательские типы с поддержкой диапазонов
← Назад к C# Academy