C# Academy · Lektion

Egna typer med stöd för Range

Lägg till stöd för Index och Range i egna typer.

Lektion 4 av 413 steg

Egna typer med stöd för Range är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.

Två sätt att stödja index och intervall

Dina egna typer kan välja att stödja syntaxen för Index och Range. Det finns två sätt: tillhandahåll explicita indexerare eller en egenskap Length/Count plus en metod Slice.

Explicit indexerare för Index

Lägg till en indexerare som tar System.Index, så fungerar operatorn ^ direkt på din typ.

using System;

class Deck {
    private int[] cards = { 1, 2, 3, 4, 5 };
    public int this[Index i] => cards[i];
}

var d = new Deck();
Console.WriteLine(d[^1]); // 5

Explicit indexerare för Range

För att stödja utsnitt med .. lägger du till en indexerare som tar System.Range och returnerar den utsnittstyp du vill ha.

using System;

class Deck {
    private int[] cards = { 1, 2, 3, 4, 5 };
    public int[] this[Range r] => cards[r];
}

var d = new Deck();
Console.WriteLine(string.Join(",", d[1..3])); // 2,3

Mönstret Length + Slice

Kompilatorn kan också skapa stöd för intervall automatiskt om din typ har en egenskap Count eller Length och en metod Slice(int start, int length).

Implementera mönstret

Här exponerar en anpassad buffert Length och Slice. Kompilatorn skriver om buf[1..3] till buf.Slice(1, 2) åt dig.

using System;

class Buffer {
    private int[] data = { 10, 20, 30, 40 };
    public int Length => data.Length;
    public int this[int i] => data[i];
    public int[] Slice(int start, int length) {
        var result = new int[length];
        Array.Copy(data, start, result, 0, length);
        return result;
    }
}

var buf = new Buffer();
Console.WriteLine(string.Join(",", buf[1..3])); // 20,30

Varför Length är viktigt

Egenskapen Length (eller Count) gör att kompilatorn kan lösa index räknade från slutet, till exempel ^1, för din typ. Utan den kan ^ inte omvandlas.

using System;

class Buffer {
    private int[] data = { 10, 20, 30, 40 };
    public int Length => data.Length;
    public int this[Index i] => data[i.GetOffset(Length)];
}

var buf = new Buffer();
Console.WriteLine(buf[^1]); // 40

Lös Index manuellt

I en Index-indexerare anropar du i.GetOffset(Length) för att omvandla ett eventuellt index räknat från slutet till en vanlig förskjutning.

using System;

class Ring {
    private string[] items = { "a", "b", "c" };
    public int Length => items.Length;
    public string this[Index i] {
        get {
            int offset = i.GetOffset(Length);
            return items[offset];
        }
    }
}

var r = new Ring();
Console.WriteLine(r[^2]); // b

Lös Range manuellt

För en Range-indexerare ger r.GetOffsetAndLength(Length) dig både startförskjutningen och antalet element som ska kopieras.

using System;

class Ring {
    private int[] items = { 1, 2, 3, 4, 5 };
    public int Length => items.Length;
    public int[] this[Range r] {
        get {
            var (start, len) = r.GetOffsetAndLength(Length);
            var slice = new int[len];
            Array.Copy(items, start, slice, 0, len);
            return slice;
        }
    }
}

var r = new Ring();
Console.WriteLine(string.Join(",", r[^3..^1])); // 3,4

Count jämfört med Length

Mönstret accepterar båda namnen: arrayer och spans använder Length; List<T> använder Count. Vilken som helst av egenskaperna uppfyller kompilatorns krav.

using System;
using System.Collections.Generic;

var list = new List<int> { 1, 2, 3, 4 };
// List<T> has Count, so Index works:
Console.WriteLine(list[^1]); // 4

Utforma returtyper för Slice

Bestäm om Slice returnerar en kopia (som arrayer) eller en vy (som spans). Vyer är billigare men delar föränderligt tillstånd, så dokumentera valet.

En komplett anpassad typ

Den här Sequence stöder både ^ och .. via explicita indexerare och en egenskap Length.

using System;

class Sequence {
    private int[] data;
    public Sequence(int[] d) => data = d;
    public int Length => data.Length;
    public int this[Index i] => data[i];
    public int[] this[Range r] => data[r];
}

var s = new Sequence(new[] { 5, 10, 15, 20 });
Console.WriteLine(s[^1]);                       // 20
Console.WriteLine(string.Join(",", s[1..^1]));  // 10,15

Snabbtest

Bekräfta vad som möjliggör intervallsyntax på en anpassad typ.

Sammanfattning

Du har lärt dig två sätt att lägga till stöd för Index/Range i dina typer.

  • Explicita indexerare som tar Index och Range.
  • Det implicita mönstret: en egenskap Count/Length samt Slice(int, int).
  • GetOffset(Length) och GetOffsetAndLength(Length) löser positioner räknade från slutet.
Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Egna typer med stöd för Range” gratis?

Ja – hela texten till ”Egna typer med stöd för Range” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Egna typer med stöd för Range”?

Lägg till stöd för Index och Range i egna typer. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Egna typer med stöd för Range”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Typen Index och operatorn ^
  2. Typen Range och operatorn ..
  3. Range med arrayer och strängar
  4. Egna typer med stöd för Range
← Tillbaka till C# Academy