0Pricing
C# Academy · Урок

Тип 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]); // 40

Index как самостоятельное значение

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]); // 4

IsFromEnd и 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 True

GetOffset определяет позицию

Индекс с отсчётом от конца имеет смысл только после того, как известна длина коллекции. 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]); // 15

Index и обычный 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: 95

Index в настоящем коде

Ниже приведена небольшая вспомогательная функция, которая возвращает последний элемент любого массива с помощью ^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 — локальная установка не требуется.

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

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