Тип Index и оператор ^
Обращайтесь к элементам коллекции с конца.
«Тип Index и оператор ^» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Знакомство с типом Index
C# предоставляет специальный тип System.Index для описания позиции внутри последовательности. В отличие от обычного int, Index может обозначать позицию, отсчитываемую от конца коллекции, а не только от начала.
Благодаря этому код вроде "вернуть последний элемент" становится выразительным и безопасным.
using System;
int[] numbers = { 10, 20, 30, 40, 50 };
Index first = 0;
Console.WriteLine(numbers[first]); // 10Оператор ^ (отсчёт с конца)
Оператор «шляпка» ^ создаёт Index, отсчитывающий позиции от конца. ^1 означает последний элемент, ^2 — предпоследний и так далее.
Обратите внимание: ^1 — это последний допустимый индекс, а ^0 равен Length и указывает на позицию сразу за концом.
using System;
int[] numbers = { 10, 20, 30, 40, 50 };
Console.WriteLine(numbers[^1]); // 50 (last)
Console.WriteLine(numbers[^2]); // 40Index как самостоятельное значение
Index — это полноценное значение: его можно сохранить в переменной, передать методам и использовать повторно. Благодаря этому позиция отделяется от коллекции.
using System;
int[] data = { 1, 2, 3, 4, 5 };
Index last = ^1;
Index secondLast = ^2;
Console.WriteLine(data[last]); // 5
Console.WriteLine(data[secondLast]); // 4IsFromEnd и Value
Каждый Index предоставляет два свойства: Value — целочисленное смещение, а IsFromEnd — признак того, что индекс создан с помощью ^.
using System;
Index fromStart = 2;
Index fromEnd = ^2;
Console.WriteLine(fromStart.Value + " " + fromStart.IsFromEnd); // 2 False
Console.WriteLine(fromEnd.Value + " " + fromEnd.IsFromEnd); // 2 TrueGetOffset определяет позицию
Индекс с отсчётом от конца имеет смысл только после того, как известна длина коллекции. Index.GetOffset(length) преобразует его в конкретное смещение с отсчётом от нуля.
using System;
Index fromEnd = ^1;
int length = 5;
int offset = fromEnd.GetOffset(length);
Console.WriteLine(offset); // 4^0 указывает сразу за концом
Поскольку ^0 преобразуется в Length, обращение по этому индексу вызывает исключение. Он полезен только как исключительная верхняя граница диапазона, с которой Вы познакомитесь на следующем уроке.
using System;
int[] data = { 1, 2, 3 };
try {
Console.WriteLine(data[^0]); // out of range!
} catch (IndexOutOfRangeException) {
Console.WriteLine("^0 is past the end");
}Index работает со многими коллекциями
Тип может использовать Index, если в нём есть индексатор, свойство Length или Count и необходимая поддержка. Массивы, string и Span<T> работают с ним без дополнительной настройки.
using System;
string word = "Coddy";
Console.WriteLine(word[^1]); // y
Console.WriteLine(word[^5]); // CДинамическое вычисление индексов
Можно создать Index из целого числа, известного во время выполнения, используя оператор ^ с переменной.
using System;
int[] data = { 5, 10, 15, 20 };
int n = 2;
Index idx = ^n; // ^ works on variables too
Console.WriteLine(data[idx]); // 15Index и обычный int
Обычный int всегда отсчитывает позицию от начала. Index добавляет возможность отсчёта от конца и при этом неявно преобразуется из int, поэтому существующий код продолжает работать.
using System;
Index a = 1; // implicit from int
Index b = ^1; // from end
Console.WriteLine(a.IsFromEnd); // False
Console.WriteLine(b.IsFromEnd); // TrueКак избежать ошибок на единицу
Раньше для обращения к последнему элементу приходилось писать arr[arr.Length - 1]. С ^1 намерение выражено явно, и в арифметике невозможно ошибиться.
using System;
int[] scores = { 88, 92, 79, 95 };
Console.WriteLine(scores[scores.Length - 1]); // old way: 95
Console.WriteLine(scores[^1]); // new way: 95Index в настоящем коде
Ниже приведена небольшая вспомогательная функция, которая возвращает последний элемент любого массива с помощью ^1, сохраняя место вызова понятным.
using System;
static T Last<T>(T[] items) => items[^1];
int[] nums = { 3, 6, 9, 12 };
Console.WriteLine(Last(nums)); // 12Быстрая проверка
Проверьте, насколько хорошо Вы понимаете тип Index и оператор ^.
Итоги
Вы узнали, что System.Index представляет позицию, которую можно отсчитывать от начала или, с оператором ^, от конца.
^1обозначает последний элемент, а^0равенLengthи указывает на позицию сразу за концом.IndexсодержитValue,IsFromEndиGetOffset(length).- Он неявно преобразуется из
intи работает с массивами, строками и диапазонами памяти.
Часто задаваемые вопросы
Урок «Тип Index и оператор ^» бесплатный?
Да — полный текст урока «Тип Index и оператор ^» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Тип Index и оператор ^»?
Обращайтесь к элементам коллекции с конца. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Тип Index и оператор ^»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Тип Index и оператор ^
- Тип Range и оператор ..
- Диапазоны с массивами и строками
- Пользовательские типы с поддержкой диапазонов