Комментарии 32
А индексацию булевыми значениями array[array > 0] можно делать ?
Заодно и стринговыми, потому что почему бы и нет, да?
а это уже Range (https://docs.microsoft.com/ru-ru/dotnet/api/system.range?view=net-6.0)
int[] afterZero = array[1..^0];
ну или LINQ:
IEnumerable<int> tail = array.Where((x, i) => i > 0);
Можно забыть отнять единицу и получить ошибку во время выполнения работы. Поверьте, начинающие программисты очень часто забывают про это.
Как можно забыть, если ты по идее, должен array.len-1 сохранить в отдельном переменной, если array.len не меняется
абсолютно ненужная свистоперделка, жаль что таки включили....
Правильно indices
.
То есть от начала мы считаем с 0, а от конца с 1. Читаемость кода теми, кто не использует эту фичу постоянно очень усложняется
Я тоже разочарован этим фактом. Была какая-то причина так делать?
Мне кажется, лучше всего сделано в D - там используется контекстный символ $, означающий размер индексируемого массива. В результате получается
int arr[] = {1,2,3,4,5};
int x = arr[0]; // 1
int y = arr[$-1]; // 5
т.е. да, мы видим что последний элемент имеет индекс "$-1" (т.е. понятно откуда в C#8 растут ноги индексации с единицы). Запись на 1 символ больше чем в C#8, зато никаких специальных типов, можно по прежнему использовать обычные целые числа.
А вот идея индексации с конца отрицательными числами, как делается в некоторых языках - не самая лучшая. Индекс может оказаться отрицательным случайно, по ошибке.
Но и за контекст не вытащить. А в шарпе это System.Index может быть параметром функции, например.
А можно написать, например, так: arr[$ / 2]
?
Да, компилируется и работает как и ожидается.
Следует помнить, что индексация начинается с нуля…
Можно забыть отнять единицу и получить ошибку во время выполнения работы. Поверьте, начинающие программисты очень часто забывают про это.
Теперь появился универсальный, удобный и логически понятный способ получения последнего элемента массива.
…важно помнить, что для индексов с отсчетом от конца массива счет начинается с 1 (а не с 0, как в обычном случае).
{
// логика
}
Простите, не удержался :)
// Получаем длину массива
var length = numbers.Length;
// Получаем последний элемент
var lastNumber = numbers[length - 1];
Какие есть в этом коде минусы:
1. Можно забыть отнять единицу и получить ошибку во время выполнения работы.
2. Код становится менее читаемым
Не согласен с обоими пунктами. Первое: с таким же успехом можно забыть и все остальное - даже то, как создать новый проект в VS. Второе: читаемость отличная; этот код можно дословно перевести на русский язык и его поймет половина НЕпрограммистов.
А вот что забыл сам автор, так это проверку length
на 0
.
Все таки наше общество программистов ещё не доросли до общества западных программистов.
Нам бы лишь бы найти за что упрекнуть. Откуда это все идёт не понимаю
Не думайте, что западные программисты в своих сообществах только и делают, что обмазывают друг друга восхвалениями. Дискуссии на фоне несогласий у них случаются не менее пылкие, знаете ли. Безусловно, я мог бы формулировать свои мысли более деликатно (в стиле "да, но" или как-то подобно тому), но, к своему стыду, не посчитал, что отказ от этого принесет кому-либо душевных травм. Вполне возможно, представители "сообщества западных программистов" более склонны не задеть чувства окружающих, но, скорее того, отличия между "ими" и "нами" в другом: воспринимать критику как акт агрессии - это да, это наше, родное.
Напрягает лишь, что есть возможность хранить индекс объектом, и что возможность в [] указывать new Index() позволяет и поощрает создавать отдельный объект для обращения к элементу по индексу, а создавать лишние объекты - не есть хорошо. Но если данная фича также имеет поддержку compile-time развертки a[^N] в a[a.lenght - N], то вопросов меньше
Индекс - это структура, так что аллокаций нет.
Плюс, действительно, compile-time разверта есть, и более того, она работает для array-like типов которые имеют индексер и свойство Length или Count. То есть еще один duck typing. Странно, что это не отраженно в статье. Потому что, например, List<> не имеет индексер с типом Index.
а рэнжи то в C# завезли?
var part = myarray[1-4];
Лично мне нравится, что появилась такая функция (индексы). Пригодится.
Где то под капотом: ^number=.length-number
Прикольная штука, спасибо за разъяснение.
Индексы (Indices) в C# 8