TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #723 1.1K
День пятьсот девяносто второй. #ЗаметкиНаПолях
Индексы и Диапазоны в 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
var slice = numbers[..3];


Класс Index
Класс 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
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →