Menu
Coddy logo textTech

Indexer (this[])

Teil des Abschnitts Objektorientierte Programmierung der C#-Journey von Coddy — Lektion 37 von 70.

Indexer ermöglichen es Ihnen, auf Elemente in Ihrer Klasse mit einer Array-ähnlichen Klammerschreibweise zuzugreifen. Anstatt eine Methode wie collection.GetItem(0) aufzurufen, können Sie das intuitivere collection[0] schreiben.

Sie definieren einen Indexer unter Verwendung des this-Schlüsselworts mit eckigen Klammern:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

Jetzt können Sie auf Wörter auf natürliche Weise zugreifen:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hallo
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

Indexer sind nicht auf Ganzzahlen beschränkt. Sie können jeden Typ als Indexparameter verwenden, was sie für einen Dictionary-ähnlichen Zugriff nützlich macht:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

Wie Properties können auch Indexer schreibgeschützt sein (lassen Sie den Setter weg) oder Validierungslogik in ihren Accessoren enthalten. Sie sind ideal, wenn Ihre Klasse eine Collection umschließt oder wenn die Klammerschreibweise den Code lesbarer macht.

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine Playlist-Klasse erstellen, mit der Sie über die intuitive Klammerschreibweise auf Songs zugreifen können, genau wie bei der Arbeit mit einem Array. Sie erstellen eine Musik-Playlist, in der Songs über einen Indexer anhand ihrer Position abgerufen und aktualisiert werden können.

Sie werden Ihren Code auf zwei Dateien aufteilen:

  • Playlist.cs: Erstellen Sie eine Playlist-Klasse im Namespace Music, die eine interne Sammlung von Songs kapselt und über einen Indexer einen array-ähnlichen Zugriff ermöglicht. Ihre Playlist sollte Folgendes enthalten:
    • Ein privates String-Array zum Speichern von Songtiteln
    • Einen Konstruktor, der eine kommagetrennte Zeichenfolge von Songtiteln akzeptiert und diese in das interne Array aufteilt
    • Einen Indexer mit der Syntax this[int index], der sowohl das Abrufen als auch das Setzen von Songs an einer bestimmten Position ermöglicht
    • Eine schreibgeschützte Eigenschaft Count, die die Anzahl der Songs in der Playlist zurückgibt
    • Eine Methode GetAllSongs(), die alle Songs zurückgibt, verbunden durch " | "
  • Program.cs: Erstellen Sie in Ihrer Hauptdatei eine Playlist aus der Eingabe und verwenden Sie dann den Indexer, um auf Songs zuzugreifen und diese zu ändern. Demonstrieren Sie sowohl das Lesen von Songs nach Index als auch das Aktualisieren eines Songs an einer bestimmten Position.

Sie erhalten drei Eingaben:

  • Eine kommagetrennte Liste von Songtiteln (z. B. Song A,Song B,Song C)
  • Einen abzurufenden Index (Ganzzahl)
  • Einen neuen Songtitel, der den Song an demselben Index ersetzt

Geben Sie die Ausgabe in diesem Format aus:

Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}

Wenn die Eingaben beispielsweise Rock Anthem,Jazz Vibes,Pop Hit, 1 und Blues Classic sind, sollte die Ausgabe wie folgt lauten:

Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop Hit

Beachten Sie, wie Sie mit dem Indexer auf playlist[1] zugreifen können, um "Jazz Vibes" abzurufen, und dann playlist[1] = "Blues Classic" zuweisen können, um ihn zu aktualisieren – viel natürlicher als der Aufruf von Methoden wie GetSongAt(1) oder SetSongAt(1, "Blues Classic")!

Spickzettel

Indexer ermöglichen es Ihnen, auf Elemente in Ihrer Klasse mit einer Array-ähnlichen Klammerschreibweise (collection[0]) anstelle von Methodenaufrufen zuzugreifen.

Definieren Sie einen Indexer mit dem Schlüsselwort this und eckigen Klammern:

public class Sentence
{
    private string[] words;
    
    public Sentence(string text)
    {
        words = text.Split(' ');
    }
    
    public string this[int index]
    {
        get { return words[index]; }
        set { words[index] = value; }
    }
}

Anwendungsbeispiel:

Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]);  // Hello
s[1] = "C#";
Console.WriteLine(s[1]);  // C#

Indexer können jeden Typ als Indexparameter verwenden, nicht nur Ganzzahlen:

public string this[string key]
{
    get { return dictionary[key]; }
    set { dictionary[key] = value; }
}

Wie Eigenschaften können Indexer schreibgeschützt sein (den Setter weglassen) oder Validierungslogik in ihren Accessoren enthalten.

Probier es selbst

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // Eingaben lesen
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: Erstelle ein Playlist-Objekt aus der songList

        // TODO: Gib die Gesamtzahl der Songs unter Verwendung der Count-Eigenschaft aus

        // TODO: Gib den Song am angegebenen Index unter Verwendung des Indexers aus

        // TODO: Aktualisiere den Song am angegebenen Index unter Verwendung des Indexers

        // TODO: Gib alle Songs nach der Aktualisierung unter Verwendung von GetAllSongs() aus
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung