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.
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.
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"]);
Ola 3 5
- 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.
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ł");
}
}
- Prześledź kod
using System.Collections.Generic;jest konieczne, żeby korzystać zList<T>iDictionary<TKey, TValue>— to osobna biblioteka od podstawowegoSystem. NazwaList<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).
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ę →