День семьдесят четвёртый. #CSharp8
Новые функции в C# 8.
5. Индексы и диапазоны
Диапазоны и индексы предоставляют краткий синтаксис указания поддиапазонов элементов массива или типов
Вы можете указать индекс с конца, используя оператор
Вы можете указать диапазон с помощью оператора
Рассмотрим следующий массив строк, обозначенный индексами с начала и с конца:
Вы можете получить последнее слово с помощью индекса
Заметьте, что для использования диапазонов требуется установить 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
Новые функции в 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]}");Следующий код создаёт поддиапазон со словами "quick", "brown" и "fox". Он включает элементы с
// выведет "dog"
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