O C # 8.0 apresenta uma maneira conveniente de dividir matrizes - consulte o post oficial do blog em C # 8.0 .
A sintaxe para acessar o último elemento de uma matriz é
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Gostaria de saber por que a indexação para acessar os elementos para trás começa em 1 em vez de 0? Existe uma razão técnica para isso?
[beginInclusive, endExclusive)
. É uma convenção comum.value[0..^0]
, uma vez que o índice final é exclusivo (que é como a maioria dos outros idiomas também funciona). Além disso, convenientemente,value[^i..^0]
você fornecerá os últimosi
itens.rbegin()
discorda um pouco dessa noção - o primeiro item desse intervalo não é o único além do fim. ;-)value[-1] # 13
Respostas:
Resposta oficial
Para uma melhor visibilidade, aqui está um comentário de Mads Torgersen explicando essa decisão de design na postagem do blog C # 8 :
Minha resposta
Acho que isso corresponde à sintaxe clássica à qual estamos acostumados:
Se usasse 0, seria confuso quando as duas sintaxes fossem usadas lado a lado. Dessa forma, possui menor carga cognitiva.
Outras linguagens como Python também usam a mesma convenção.
fonte
None
no lugar de um número:[0,1,2,3,4][2:None] == [2,3,4]
. Mas, sim, você não pode usar um número inteiro como índice final (sem calcular obviamente o comprimento).x..
? Parece bom e nunca tive problemas com a[3:]
sintaxe do python .endIndex
como um índice negativo (isto é, índice do final), você terá uma descontinuidade entre números negativos e positivos, porque0
nesse caso não funcionará da maneira correta. Como indiquei, você deve substituir0
porNone
isso. Isso significa que seu código deve se parecer com,seq[startIndex:endIndex or None]
por exemplo. Oor None
deve ser omitido seendIndex
se espera que seja positivo.