C # 8.0 présente un moyen pratique de découper des tableaux - voir le blog officiel de C # 8.0 .
La syntaxe pour accéder au dernier élément d'un tableau est
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Je me demande pourquoi l'indexation pour accéder aux éléments à l'envers commence à 1 au lieu de 0? Y a-t-il une raison technique à cela?
[beginInclusive, endExclusive)
. C'est une convention commune.value[0..^0]
, puisque l'index de fin est exclusif (c'est ainsi que fonctionnent la plupart des autres langues). Aussi, commodément,value[^i..^0]
vous donnera les derniersi
éléments.rbegin()
quelque peu en désaccord avec cette notion - le premier élément de cette plage n'est pas non plus celui au-delà de la fin. ;-)value[-1] # 13
Réponses:
Réponse officielle
Pour une meilleure visibilité, voici un commentaire de Mads Torgersen expliquant cette décision de conception tirée du billet de blog C # 8 :
Ma réponse
Je pense que cela correspond à la syntaxe classique à laquelle nous sommes habitués:
S'il utilisait 0, ce serait déroutant lorsque les deux syntaxes étaient utilisées côte à côte. De cette façon, la charge cognitive est plus faible .
D'autres langages comme Python utilisent également la même convention.
la source
None
à la place d'un numéro:[0,1,2,3,4][2:None] == [2,3,4]
. Mais, oui, vous ne pouvez pas utiliser un entier comme index de fin (sans calculer la longueur évidemment).x..
? Cela semble bien et je n'ai jamais eu de problème avec la[3:]
syntaxe python .endIndex
comme un indice négatif (c'est-à-dire un index à partir de la fin), vous aurez une discontinuité entre les nombres négatifs et positifs car cela0
ne fonctionnera pas correctement dans ce cas. Comme je l'ai souligné, vous devez remplacer0
parNone
pour cela. Cela signifie que votre code doit ressembler à,seq[startIndex:endIndex or None]
par exemple. Leor None
doit être omis siendIndex
on s'attend à ce qu'il soit positif.