C # 8.0 bietet eine bequeme Möglichkeit zum Schneiden von Arrays - siehe offiziellen C # 8.0-Blogpost .
Die Syntax für den Zugriff auf das letzte Element eines Arrays lautet
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Ich frage mich, warum die Indizierung für den Rückwärtszugriff auf die Elemente bei 1 statt bei 0 beginnt. Gibt es dafür einen technischen Grund?
[beginInclusive, endExclusive)
. Es ist eine übliche Konvention.value[0..^0]
, da der Endindex exklusiv ist (so funktionieren auch die meisten anderen Sprachen). Außerdem erhalten Sie bequemerweisevalue[^i..^0]
die letzteni
Artikel.rbegin()
mit dieser Vorstellung nicht einverstanden - das erste Element außerhalb dieses Bereichs ist auch nicht das One-Beyond-the-End. ;-)value[-1] # 13
Antworten:
Offizielle Antwort
Zur besseren Sichtbarkeit hier ein Kommentar von Mads Torgersen , der diese Entwurfsentscheidung aus dem C # 8-Blogbeitrag erläutert :
Meine Antwort
Ich denke, dies entspricht der klassischen Syntax, die wir gewohnt sind:
Wenn 0 verwendet würde, wäre es verwirrend, wenn die beiden Syntaxen nebeneinander verwendet würden. Auf diese Weise hat es eine geringere kognitive Belastung.
Andere Sprachen wie Python verwenden dieselbe Konvention.
quelle
None
anstelle einer Nummer verwenden :[0,1,2,3,4][2:None] == [2,3,4]
. Aber ja, Sie können keine Ganzzahl als Endindex verwenden (ohne die Länge offensichtlich zu berechnen).x..
? Das scheint in Ordnung zu sein und ich hatte nie Probleme mit der Python-[3:]
Syntax.endIndex
als negativer Index berechnen möchten (dh als Index vom Ende), eine Diskontinuität zwischen negativen und positiven Zahlen0
auftritt, da dies in diesem Fall nicht richtig funktioniert. Als ich darauf hinwies , müssen Sie ersetzen0
durchNone
dafür. Dies bedeutet, dass Ihr Code beispielsweise so aussehen sollteseq[startIndex:endIndex or None]
. Dasor None
sollte weggelassen werden, wennendIndex
erwartet wird, dass es positiv ist.