Menu
Coddy logo textTech

Indexer (this[])

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

Indexer ermöglichen dir den Zugriff auf Elemente in deiner Klasse mithilfe einer arrayähnlichen Klammerschreibweise. Statt eine Methode wie collection.GetItem(0) aufzurufen, kannst du die intuitivere Schreibweise collection[0] verwenden.

Du definierst 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; }
    }
}

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. Du kannst jeden Typ als Indexparameter verwenden, wodurch sie für den Zugriff ähnlich wie bei einem Wörterbuch nützlich sind:

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

Wie Eigenschaften können Indexer schreibgeschützt sein (wobei der Setter weggelassen wird) oder Validierungslogik in ihren Zugriffsmethoden enthalten. Sie eignen sich ideal, wenn deine Klasse eine Sammlung kapselt oder wenn die Klammersyntax den Code lesbarer macht.

challenge icon

Aufgabe

Einfach

Lass uns eine Playlist-Klasse erstellen, mit der du über eine intuitive Klammernotation auf Songs zugreifen kannst, genau wie bei der Arbeit mit einem Array. Du erstellst eine Musik-Playlist, in der Songs anhand ihrer Position mithilfe eines Indexers abgerufen und aktualisiert werden können.

Du wirst deinen Code auf zwei Dateien aufteilen:

  • Playlist.cs: Erstelle eine Playlist-Klasse im Namespace Music, die eine interne Sammlung von Songs kapselt und über einen Indexer arrayähnlichen Zugriff ermöglicht. Deine Playlist sollte Folgendes enthalten:
    • Ein privates String-Array zum Speichern der Songtitel
    • Einen Konstruktor, der eine durch Kommas getrennte Zeichenfolge von Songtiteln akzeptiert und sie in das interne Array aufteilt
    • Einen Indexer mit 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, verbunden durch " | ", zurückgibt
  • Program.cs: Erstelle in deiner Hauptdatei eine Playlist aus der Eingabe und verwende anschließend den Indexer, um Songs abzurufen und zu ändern. Zeige sowohl das Lesen von Songs anhand ihres Index als auch das Aktualisieren eines Songs an einer bestimmten Position.

Du erhältst drei Eingaben:

  • Eine durch Kommas getrennte 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

Gib 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 lauten, sollte die Ausgabe wie folgt aussehen:

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

Beachte, wie der Indexer dir ermöglicht, auf playlist[1] zuzugreifen, um "Jazz Vibes" abzurufen, und anschließend playlist[1] = "Blues Classic" zuzuweisen, um den Song zu aktualisieren – viel natürlicher, als Methoden wie GetSongAt(1) oder SetSongAt(1, "Blues Classic") aufzurufen!

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

Übe selbstständig: Online-C#-Compiler