C # 8.0 presenta una forma conveniente de cortar matrices: consulte la publicación de blog oficial de C # 8.0 .
La sintaxis para acceder al último elemento de una matriz es
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Me pregunto por qué la indexación para acceder a los elementos al revés comienza en 1 en lugar de 0. ¿Hay alguna razón técnica para esto?
[beginInclusive, endExclusive)
. Es una convención común.value[0..^0]
, ya que el índice final es exclusivo (que es como funcionan también la mayoría de los otros idiomas). Además, convenientemente,value[^i..^0]
le dará los últimosi
artículos.rbegin()
no está de acuerdo con esa noción: el primer elemento fuera de ese rango tampoco es el que está más allá del final. ;-)value[-1] # 13
Respuestas:
Respuesta oficial
Para una mejor visibilidad, aquí hay un comentario de Mads Torgersen que explica esta decisión de diseño de la publicación del blog C # 8 :
Mi respuesta
Creo que esto es para que coincida con la sintaxis clásica a la que estamos acostumbrados:
Si usara 0, sería confuso cuando las dos sintaxis se usaran una al lado de la otra. De esta manera tiene menor carga cognitiva.
Otros lenguajes como Python también usan la misma convención.
fuente
None
en lugar de un número:[0,1,2,3,4][2:None] == [2,3,4]
. Pero sí, no puede usar un número entero como índice final (sin calcular la longitud obviamente).x..
? Eso parece estar bien y nunca he tenido problemas con la[3:]
sintaxis de Python .endIndex
como un índice negativo (es decir, un índice desde el final) tendrá una discontinuidad entre los números negativos y positivos porque0
no funcionará de la manera correcta en ese caso. Como señalé, tienes que reemplazar0
porNone
eso. Esto significa que su código debería verseseq[startIndex:endIndex or None]
por ejemplo. Seor None
debe omitir siendIndex
se espera que sea positivo.