A Python programozási nyelv szépsége, hogy a kollekciók negatív index esetén sem dobnak kivételt. Pythonban, ha egy lista -1. elemét akarjuk olvasni, akkor valójában a lista utolsó elemét kapjuk meg. Ez a viselkedés elsőre furcsa lehet, de igen hasznos tud lenni, illetve jobban olvashatóbb tőle a kód, ha megszoktuk.
Ezt az indexelési viselkedést a C# 8.0 is bevezeti a kompatibilitás és a konvenciók megtartása mellett. C# 8.0 esetén ugyanúgy IndexOutOfRangeException kivétel a jutalmunk, ha egy tömb -1. elemére vagyunk kíváncsiak. A tömb utolsó elemétől indexelésre a ^ operátor használható az indexelőn belül:
var pelda = new string[]
{
"Ez", "Egy", "Pelda"
};
//utolsó elem kiolvasása
var szo = pelda[pelda.Length - 1];
//ez is
var szo = pelda[^1];
Az újdonságok listája nem merül csak ki ennyiben. Mi van akkor, ha a tömbünkból az első elem kivételével szükségünk van a többi elemre? Ebben az esetben sokaknak elsőre a LINQ használata ugrik be. Azonban a Skip(1) hívás hátránya, hogy egy IEnumerable<T> típust kapunk, amit hívás után konvertálnunk kell a tényleges tömb típusra. A .. operátorral az indexelőn belül lehetőségünk van a tömb egy részét megcímezni:
//"Ez" és "Egy" szavakat tartamazza.
var elsoKetto = pelda[0..2];
Ha nem adjuk meg a .. után az utolsónak kívánt elemet, akkor a tömb végéig megkapjuk a benne szereplő elemeket:
//"Egy" és "Pelda" szavakat tartalmazza
var elemek = pelda[1..];
//teljes tömb, mivel se eleje, se vége az indexelésnek
var teljes = pelda[..];
// példa a .. és a kalap jel vegyítésére:
var alma = "almafa"[0..^2];
Az indexelés menthető későbbi felhasználásra egy Range típusú objektumba:
//sorozat definiálása
Range szavak = 1..2;
//felhasználása
var felhasznalt = pelda[szavak];
A Range típus egy struktúra, aminek a kezdő és vég indexét a létrehozása után már nem tudjuk módosítani.
Kollekciók
C# 13 óta az implicit indexelést kollekciók inicializálásakor is alkalmazhatjuk:
public class TimerRemaining
{
public int[] buffer { get; set; } = new int[10];
}
var countdown = new TimerRemaining()
{
buffer =
{
[^1] = 0,
[^2] = 1,
[^3] = 2,
[^4] = 3,
[^5] = 4,
[^6] = 5,
[^7] = 6,
[^8] = 7,
[^9] = 8,
[^10] = 9
}
};