Тип 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,3Range.GetOffsetAndLength
Чтобы вычислить диапазон относительно конкретной длины, вызовите GetOffsetAndLength(length). Он возвращает начальное смещение и длину среза, самостоятельно обрабатывая индексы с отсчётом от конца.
using System;
Range r = ^3..^1;
var (offset, length) = r.GetOffsetAndLength(5);
Console.WriteLine(offset + " " + length); // 2 2Range.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 — локальная установка не требуется.
Все уроки этого курса
- Тип Index и оператор ^
- Тип Range и оператор ..
- Диапазоны с массивами и строками
- Пользовательские типы с поддержкой диапазонов