C # 8.0 memperkenalkan cara mudah untuk mengiris array - lihat blogpost resmi C # 8.0 .
Sintaks untuk mengakses elemen terakhir array adalah
int value[] = { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
Saya bertanya-tanya mengapa pengindeksan untuk mengakses elemen mundur dimulai pada 1 bukan 0? Apakah ada alasan teknis untuk ini?
[beginInclusive, endExclusive)
. Itu adalah konvensi umum.value[0..^0]
, karena indeks akhir bersifat eksklusif (yang juga merupakan cara kerja sebagian besar bahasa lain). Juga, nyaman,value[^i..^0]
akan memberi Andai
item terakhir .rbegin()
agak tidak setuju dengan gagasan itu - item pertama dari kisaran itu juga bukan yang paling luar. ;-)value[-1] # 13
Jawaban:
Jawaban resmi
Untuk visibilitas yang lebih baik, berikut adalah komentar dari Mads Torgersen yang menjelaskan keputusan desain ini dari posting blog C # 8 :
Jawabanku
Saya pikir ini cocok dengan sintaksis klasik yang biasa kita gunakan:
Jika menggunakan 0, itu akan membingungkan ketika kedua sintaks digunakan berdampingan. Dengan cara ini memiliki muatan kognitif yang lebih rendah .
Bahasa lain seperti Python juga menggunakan konvensi yang sama.
sumber
None
di tempat nomor:[0,1,2,3,4][2:None] == [2,3,4]
. Tapi, ya Anda tidak bisa menggunakan integer sebagai indeks akhir (tanpa menghitung panjangnya).x..
? Itu tampaknya baik dan saya tidak pernah punya masalah dengan[3:]
sintaks python .endIndex
sebagai indeks negatif (yaitu indeks dari akhir) Anda akan memiliki diskontinuitas antara angka negatif dan positif karena0
tidak akan bekerja dengan cara yang benar dalam kasus itu. Seperti yang saya menunjukkan Anda harus mengganti0
denganNone
untuk itu. Ini berarti kode Anda akan terlihat sepertiseq[startIndex:endIndex or None]
misalnya. Theor None
harus dihilangkan jikaendIndex
diharapkan menjadi positif.