C # 8.0 wprowadza wygodny sposób dzielenia tablic - zobacz oficjalny wpis na blogu C # 8.0 .
Składnia dostępu do ostatniego elementu tablicy to
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Zastanawiam się, dlaczego indeksowanie w celu uzyskania dostępu do elementów wstecz zaczyna się od 1 zamiast 0? Czy jest tego techniczny powód?
[beginInclusive, endExclusive)
. To powszechna konwencja.value[0..^0]
, ponieważ indeks końcowy jest wyłączny (tak działa również większość innych języków). Ponadto wygodnievalue[^i..^0]
da ci ostatniei
przedmioty.rbegin()
nieco nie zgadza się z tym pojęciem - pierwszy element z tego zakresu również nie jest tym, który znajduje się poza końcem. ;-)value[-1] # 13
Odpowiedzi:
Oficjalna odpowiedź
Aby uzyskać lepszą widoczność, oto komentarz Madsa Torgersena wyjaśniający tę decyzję projektową z wpisu na blogu C # 8 :
Moja odpowiedź
Myślę, że jest to zgodne z klasyczną składnią, do której jesteśmy przyzwyczajeni:
Gdyby używał 0, byłoby mylące, gdyby dwie składnie były używane obok siebie. W ten sposób ma mniejsze obciążenie poznawcze.
Inne języki, takie jak Python, również używają tej samej konwencji.
źródło
None
w miejsce numeru:[0,1,2,3,4][2:None] == [2,3,4]
. Ale tak, nie możesz użyć liczby całkowitej jako indeksu końcowego (bez oczywiście obliczenia długości).x..
? Wydaje się w porządku i nigdy nie miałem problemu ze[3:]
składnią Pythona .endIndex
jako indeks ujemny (tj. Indeks od końca), będziesz miał nieciągłość między liczbami ujemnymi i dodatnimi, ponieważ0
w tym przypadku nie będzie działać poprawnie. Jak podkreślił, trzeba zastąpić0
przezNone
to. Oznacza to, że Twój kod powinien wyglądaćseq[startIndex:endIndex or None]
na przykład.or None
Powinny zostać pominięte, jeśliendIndex
ma być dodatni.