День семьдесят четвёртый. #CSharp8

Новые функции в C# 8.

5. Индексы и диапазоны

Диапазоны и индексы предоставляют краткий синтаксис указания поддиапазонов элементов массива или типов Span<T> или ReadOnlySpan<T>.

Вы можете указать индекс с конца, используя оператор ^. Выражение array[2] означает "2й элемент с начала". Теперь можно использовать array[^2], что означает "2й элемент с конца". Индекс ^0 означает "конец", то есть индекс, следующий за последним элементом.

Вы можете указать диапазон с помощью оператора ... Например, 0..^0 обозначает весь диапазон массива: 0 с начала до, но не включая, 0 с конца. Любой из операндов оператора может быть как индексом "с начала", так и "с конца". Более того, любой из операндов может быть опущен. По умолчанию 0 – начальный индекс, ^0 – конечный индекс.

Рассмотрим следующий массив строк, обозначенный индексами с начала и с конца:

var words = new string[]

{

// с начала с конца

"The", // 0 ^9

"quick", // 1 ^8

"brown", // 2 ^7

"fox", // 3 ^6

"jumped", // 4 ^5

"over", // 5 ^4

"the", // 6 ^3

"lazy", // 7 ^2

"dog" // 8 ^1

};

Индекс каждого элемента усиливает концепцию "с начала" и "с конца", а диапазоны исключают конец диапазона. "Старт" массива – это первый элемент, а "конец" массива находится за последним элементом.

Вы можете получить последнее слово с помощью индекса ^1:

Console.WriteLine($"The last word is {words[^1]}");

// выведет "dog"

Следующий код создаёт поддиапазон со словами "quick", "brown" и "fox". Он включает элементы с words[1] до words[3]. Элемент words[4] не входит в диапазон.

var quickBrownFox = words[1..4];

Следующий код создаёт поддиапазон со словами "lazy" и "dog". Он включает элементы words[^2] и words[^1]. Конечный индекс words[^0] не включается:

var lazyDog = words[^2..^0];

Следующие примеры создают диапазоны, открытые с начала, с конца и с обоих концов:

var allWords = words[..]; // содержит все слова

var firstPhrase = words[..4]; // слова от "The" до "fox"

var lastPhrase = words[6..]; // слова "the", "lazy" и "dog"

Вы также можете объявлять диапазоны как переменные, которые потом могут использоваться внутри квадратных скобок:

Range phrase = 1..4;

var text = words[phrase];

Заметьте, что, если вы укажете неверный диапазон, где начальное значение больше конечного, то будет выброшено исключение времени выполнения System.OverflowException, например:

var invalidRange = words[5..2];

var invalidEnd = words[6..^4];

При этом компилятор не выдаёт ошибок или предупреждений во время компиляции, даже если вы явно указываете большее начальное значение (по крайней мере в нынешней версии).



Заметьте, что для использования диапазонов требуется установить SDK .NET Core 3.0 и использовать его в качестве Target framework в свойствах проекта. А чтобы он появился в этом списке, возможно, потребуется отметить флажок “Use previews of the .NET Core SDK” в Tools > Options > Projects and Solutions > .NET Core и перезагрузить Visual Studio.



Источник:
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8