C # 8.0 представляет удобный способ нарезки массивов - см. Официальный пост C # 8.0 .
Синтаксис для доступа к последнему элементу массива
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Мне интересно, почему индексирование для доступа к элементам в обратном направлении начинается с 1 вместо 0? Есть ли техническая причина для этого?
[beginInclusive, endExclusive)
. Это общее соглашение.value[0..^0]
, так как конечный индекс является эксклюзивным (так работает и большинство других языков). Также удобноvalue[^i..^0]
дадут вам последниеi
предметы.rbegin()
некоторой степени не согласен с этим понятием - первый элемент из этого диапазона также не является зацикленным . ;-)value[-1] # 13
Ответы:
Официальный ответ
Для лучшей наглядности вот комментарий от Мэдс Торгерсен, объясняющий это дизайнерское решение из блога C # 8 :
Мой ответ
Я думаю, что это соответствует классическому синтаксису, к которому мы привыкли:
Если бы он использовал 0, было бы непонятно, когда два синтаксиса использовались бок о бок. Таким образом, у него снижается когнитивная нагрузка.
Другие языки, такие как Python, также используют то же соглашение.
источник
None
вместо ряда:[0,1,2,3,4][2:None] == [2,3,4]
. Но да, вы не можете использовать целое число в качестве конечного индекса (без вычисления длины, очевидно).x..
? Это выглядит нормально, и у меня никогда не было проблем с[3:]
синтаксисом python .endIndex
как отрицательный индекс (то есть индекс с конца), вы будете иметь разрыв между отрицательными и положительными числами, потому что0
не будет работать правильно в этом случае. Как я отметил, что вам нужно заменить0
наNone
для этого. Это означает, что ваш код должен выглядеть,seq[startIndex:endIndex or None]
например. Значениеor None
должно быть опущено, еслиendIndex
ожидается, что оно будет положительным.