Индексы и Диапазоны в C#8
Я уже писал о новых классах
Index и Range в C#8. Здесь мы рассмотрим их подробнее.Range
Это структура с двумя важными свойствами:
Start и End типа Index (о нём позже), где Start – это индекс начального элемента диапазона, а End – индекс конечного (не включая конечный элемент): public readonly struct Range : IEquatable<Range> {
public Index Start { get; }
public Index End { get; }
public Range(Index start, Index end) {
Start = start;
End = end;
}
…
}
Использовать Range можно как через обычный конструкторvar oldSchool = new Range(1,4);так и через новый оператор диапазона, который можно представить так:
System.Range operator ..(Index start = 0, Index end = ^0);Помните, что
var range = 1..4;
Range - это тип, представляющий только начало и конец. Он не содержит элементов внутри диапазона, пока мы не применим его к коллекции.Непосредственно в
Range мы можем лишь получить границы:Console.WriteLine($"диапазон с {range.Start}-го по {range.End}-й элемент");
Можно спутать выражение 1..4, как получение целых чисел от 1 до 3 (4 не включается), но на самом деле это делается так: var numbers = Enumerable.Range(0, 10).ToArray();При этом синтаксис оператора .. допускает отсутствие одного или обоих аргументов. Тогда вместо отсутствующего аргумента будет выступать соответственно начало или конец последовательности:
var result = numbers[1..4];
//от начала до элемента с индексом 3Класс Index
var slice = numbers[..3];
Класс
Index используется для определения начального или конечного значения диапазона. Давайте посмотрим на конструктор класса:public Index(int value, bool fromEnd = false) {
if (value < 0) {
ThrowHelper.ThrowValueArgumentOutOfRange_NeedNonNegNumException();
}
if (fromEnd)
_value = ~value;
else
_value = value;
}
Отметим две важные характеристики:- Значение индекса - неотрицательное целое число (свойство
Value).- Значение может быть с начала или с конца последовательности (определяется в свойстве
IsFromEnd).Мы можем создать экземпляр
Index как через обычный конструктор:var oldSchool = new Index(1, fromEnd: true)так и используя унарный оператор
^, который можно представить следующим образом:System.Index operator ^(int fromEnd);То есть получить последний элемент коллекции можно так:
var last = numbers[^1];Замечание: нельзя использовать индекс
^0. Это приведёт к исключению IndexOutOfRangeException. Однако, мы можем использовать ^0 в диапазоне, т.к. последний элемент диапазона не включается:var slice = numbers[2..^0];Что будет равносильно
var slice = numbers[2..];Окончание следует…
Источник: https://khalidabuhakmeh.com/use-range-and-index-in-csharp-8