Menu
Coddy logo textTech

Indeksery (this[])

Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 37 z 70.

Indeksery pozwalają uzyskiwać dostęp do elementów klasy za pomocą nawiasów kwadratowych, podobnie jak w przypadku tablicy. Zamiast wywoływać metodę, taką jak collection.GetItem(0), możesz napisać bardziej intuicyjne collection[0].

Definiujesz indeksator za pomocą słowa kluczowego this i nawiasów kwadratowych:

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

Teraz możesz uzyskiwać dostęp do słów w naturalny sposób:

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

Indeksery nie są ograniczone do liczb całkowitych. Jako parametru indeksu możesz użyć dowolnego typu, dzięki czemu przydają się do dostępu podobnego do dostępu do słownika:

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

Podobnie jak właściwości, indeksatory mogą być tylko do odczytu (bez settera) lub zawierać logikę walidacji w swoich akcesorach. Sprawdzają się idealnie, gdy klasa opakowuje kolekcję lub gdy notacja nawiasowa zwiększa czytelność kodu.

challenge icon

Wyzwanie

Łatwy

Zbudujmy klasę Playlist, która pozwala uzyskiwać dostęp do utworów za pomocą intuicyjnej notacji nawiasowej, podobnie jak w przypadku pracy z tablicą. Utworzysz playlistę, w której utwory można pobierać i aktualizować na podstawie ich pozycji za pomocą indeksatora.

Rozmieścisz swój kod w dwóch plikach:

  • Playlist.cs: Utwórz klasę Playlist w przestrzeni nazw Music, która opakowuje wewnętrzny zbiór utworów i zapewnia dostęp podobny do tablicy za pomocą indeksatora. Twoja playlista powinna mieć:
    • Prywatną tablicę ciągów znaków do przechowywania tytułów utworów
    • Konstruktor, który przyjmuje ciąg tytułów utworów rozdzielonych przecinkami i dzieli go na wewnętrzną tablicę
    • Indeksator używający składni this[int index], który umożliwia zarówno pobieranie, jak i ustawianie utworów na określonej pozycji
    • Właściwość tylko do odczytu Count, która zwraca liczbę utworów na playliście
    • Metodę GetAllSongs(), która zwraca wszystkie utwory połączone za pomocą " | "
  • Program.cs: W pliku głównym utwórz playlistę na podstawie danych wejściowych, a następnie użyj indeksatora, aby uzyskać dostęp do utworów i je zmodyfikować. Zademonstruj zarówno odczytywanie utworów według indeksu, jak i aktualizowanie utworu na określonej pozycji.

Otrzymasz trzy dane wejściowe:

  • Listę tytułów utworów rozdzielonych przecinkami (np. Song A,Song B,Song C)
  • Indeks utworu do pobrania (liczba całkowita)
  • Nowy tytuł utworu, który zastąpi utwór o tym samym indeksie

Wyświetl wynik w tym formacie:

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

Na przykład, jeśli danymi wejściowymi są Rock Anthem,Jazz Vibes,Pop Hit, 1 i Blues Classic, wynikiem powinno być:

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

Zauważ, że indeksator pozwala uzyskać dostęp do playlist[1], aby pobrać "Jazz Vibes", a następnie przypisać playlist[1] = "Blues Classic", aby zaktualizować utwór — to znacznie bardziej naturalne niż wywoływanie metod takich jak GetSongAt(1) lub SetSongAt(1, "Blues Classic")!

Spróbuj swoich sił

using System;
using Music;

class Program
{
    public static void Main(string[] args)
    {
        // Odczytaj dane wejściowe
        string songList = Console.ReadLine();
        int index = Convert.ToInt32(Console.ReadLine());
        string newSong = Console.ReadLine();

        // TODO: Utwórz obiekt Playlist na podstawie songList

        // TODO: Wypisz łączną liczbę utworów, używając właściwości Count

        // TODO: Wypisz utwór o podanym indeksie, używając indeksera

        // TODO: Zaktualizuj utwór o podanym indeksie, używając indeksera

        // TODO: Wypisz wszystkie utwory po aktualizacji, używając GetAllSongs()
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C# online