INF.04 · C# · lekcja 8

Tablice i kolekcje (List, Dictionary)

Lista rośnie, tablica ma stałą długość

  • Zrozum
  • Sprawdź
  • Napisz sam

Po tej lekcji: lista rośnie, tablica ma stałą długość

Dzisiaj zrobisz konkretną rzecz

Prawdziwe programy niemal zawsze operują na WIELU danych naraz — liście filmów, klientów, produktów w koszyku. Bez tablic i kolekcji musiałbyś tworzyć osobną zmienną dla każdego elementu, co jest niepraktyczne już przy kilku elementach, a niemożliwe przy setkach.

Koszyk zakupowy w każdym sklepie internetowym to w praktyce List<T> — kolekcja, do której produkty są dodawane i z której są usuwane w dowolnym momencie, w przeciwieństwie do tablicy o stałym rozmiarze.

Sprawdź w działaniu

Lista rośnie, tablica ma stałą długość

Najpierw przewidź wynik. Zmień dane w modelu i porównaj efekt. Spróbuj także przypadku granicznego, a nie tylko pierwszego poprawnego przykładu.

Ta interakcja wymaga włączonego JavaScriptu.

Model pokazuje wybraną zasadę. Nie uruchamia ani nie ocenia wklejonego kodu C#.

1. Przygotuj i uruchom własny projekt

2. Najpierw mały przykład

Wykonaj tę próbę przed dłuższym rozwiązaniem. List<string> przechowuje napisy. Add dopisuje element, indeks0 wybiera pierwszy, Count podaje liczbę elementów. Dictionary wiąże klucz z wartością; nie jest listą pozycji.

Program.cscsharp
var imiona = new List<string> { "Ola", "Jan" };
imiona.Add("Ada");
Console.WriteLine(imiona[0]);
Console.WriteLine(imiona.Count);
var punkty = new Dictionary<string, int> { ["Ola"] = 5 };
Console.WriteLine(punkty["Ola"]);
Wynik
Ola
3
5
  1. Co sprawdzić? Zmień jedną wartość i przed uruchomieniem zapisz przewidywany rezultat. Porównaj go z opisem wyniku; przy błędzie wróć do konkretnej instrukcji.

Jak to działa — 1

Dotąd każda zmienna przechowywała JEDNĄ wartość. Tablice i kolekcje pozwalają przechowywać WIELE wartości pod jedną nazwą.

Tablica — zbiór elementów tego samego typu, o STAŁYM, ustalonym z góry rozmiarze: string[] imiona = { "Ala", "Bartek", "Celina" }; Dostęp do elementu przez indeks, liczony OD ZERA: imiona[0] to "Ala", imiona[2] to "Celina". Rozmiar tablicy sprawdzisz przez imiona.Length.

Tablice dwuwymiarowe — "tabela" danych (wiersze i kolumny): int[,] plansza = new int[3, 3]; — dostęp przez plansza[wiersz, kolumna].

List<T> — dynamiczna lista, której rozmiar może się ZMIENIAĆ w trakcie działania programu (dodawanie/usuwanie elementów): List<string> koszyk = new List<string>(); koszyk.Add("Mleko"); dodaje element, koszyk.Remove("Mleko") usuwa, koszyk.Count zwraca aktualną liczbę elementów.

Dictionary<TKey, TValue> — zbiór par klucz-wartość (jak słownik: szukasz po kluczu, dostajesz wartość): Dictionary<string, int> wiekOsob = new Dictionary<string, int>(); wiekOsob["Ala"] = 18; zapisuje, wiekOsob["Ala"] odczytuje wartość przypisaną do klucza "Ala".

Jak to działa — 2

Krotki (Tuples) — pozwalają zwrócić lub przechowywać KILKA wartości różnych typów razem, bez tworzenia osobnej klasy: (string, int) osoba = ("Ala", 18);

3. Pełny przykład — czytaj od Main

Teraz zastąp Program.cs tym programem. Zanim uruchomisz, znajdź dane wejściowe, operację i miejsce prezentacji wyniku. W tym wariancie zachowujemy jawny Main. Nie wklejaj kilku pełnych programów do jednego pliku.

Program.cs — osobne uruchomieniecsharp
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // tablica - stały rozmiar
        string[] filmy = { "Podróż w czasie", "Ostatni bastion", "Cichy ocean" };
        Console.WriteLine("Liczba filmów: " + filmy.Length);
        Console.WriteLine("Pierwszy film: " + filmy[0]);

        // List<T> - zmienny rozmiar
        List<string> koszyk = new List<string>();
        koszyk.Add("Podróż w czasie");
        koszyk.Add("Ostatni bastion");
        Console.WriteLine("Filmów w koszyku: " + koszyk.Count);

        foreach (string tytul in koszyk)
        {
            Console.WriteLine("W koszyku: " + tytul);
        }

        // Dictionary<TKey, TValue> - ceny filmów po tytule
        Dictionary<string, double> ceny = new Dictionary<string, double>();
        ceny["Podróż w czasie"] = 9.99;
        ceny["Ostatni bastion"] = 7.99;

        Console.WriteLine("Cena: " + ceny["Podróż w czasie"] + " zł");
    }
}
  1. Prześledź kod using System.Collections.Generic; jest konieczne, żeby korzystać z List<T> i Dictionary<TKey, TValue> — to osobna biblioteka od podstawowego System. Nazwa List<string> oznacza "lista przechowująca elementy typu string" — ten sam mechanizm (tzw. generyki) poznasz szerzej w Lekcji 17, tworząc WŁASNE klasy generyczne.

Sprawdź, zanim przepiszesz cały program

Bardzo częsty błąd to próba odczytu elementu tablicy spoza jej zakresu (np. imiona[3] przy tablicy 3-elementowej, gdzie ostatni prawidłowy indeks to 2) — program zgłosi wyjątek IndexOutOfRangeException (o wyjątkach szerzej w Lekcji 16). Drugi błąd: próba dodania elementu do zwykłej tablicy metodą Add() — tablice mają STAŁY rozmiar, Add() istnieje tylko dla List<T>. Trzeci: odczyt z Dictionary nieistniejącego klucza — zgłosi wyjątek, warto najpierw sprawdzić ContainsKey().

Ćwiczenie z pomocą · samodzielna praca

4. Teraz Twoja zmiana

Utwórz tablicę z pięcioma swoimi ulubionymi filmami i wypisz je pętlą foreach (Lekcja 6).

Oczekiwany rezultat
Spełnij warunki polecenia. Zapisz wejście, otrzymany wynik i wyjaśnij, która część kodu za niego odpowiada.
Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź

Wróć do podstawowej formy oraz objaśnienia: List<string> przechowuje napisy. Add dopisuje element, indeks0 wybiera pierwszy, Count podaje liczbę elementów. Dictionary wiąże klucz z wartością; nie jest listą pozycji.

Krok 2 — pokaż podpowiedź

Zmień tylko część potrzebną do polecenia. Zachowaj działającą wersję przed zmianą i uruchamiaj po każdym małym etapie.

Krok 3 — pokaż podpowiedź

Sprawdź przypadek zwykły i graniczny; porównaj z regułą: Ola 3 5

Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.

5. Sprawdź rozumienie, nie tylko uruchomienie

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka