Referenční typy - pole
7. Procházení prvků pole pomocí cyklu
Všechna pole jsou ve skutečnosti instancemi třídy System.Array prostředí .NET Framework. Tato třída definuje některé užitečné vlastnosti a metody. Můžeme se dotázat na vlastnost Length pro zjištění počtu prvků v poli a lze také procházet všechny prvky matice pomocí příkazu for.
C# poskytuje další možnost procházet prvky pole pomocí příkazu foreach, kde není zapotřebí používat indexy.
Příkaz foreach deklaruje řídící (iterační) proměnnou cyklu, která automaticky získá hodnotu každého prvku v poli. Typ této proměnné musí odpovídat typu prvků v poli. Příkaz foreach je preferovaný způsob procházení prvků pole, který přímo vyjadřuje záměr kódu procházet všechny prvky pole. V několika případech však zjistíte, že se musíte vrátit zpět k příkazu for:
- Příkaz foreach vždy prochází celé pole. Pokud chceme procházet pouze část pole (například první polovinu), nebo se vyhnout určitým prvkům (například každý třetí prvek), je jednodušší použít příkaz for
- Příkaz foreach vždy probíhá od indexu 0 do délky pole - 1. Pokud chceme procházet prvky odzadu nebo v jiné sekvenci, je jednodušší použít příkaz for
- Pokud potřebujeme znát uvnitř tělo cyklu index prvku, nikoli pouze hodnotu prvku, musíme použít příkaz for
- Pokud potřebujeme upravit prvky pole, musíme použít příkaz for. Důvodem je to, že řídící proměnná cyklu foreach je kopií každého prvku pole, kterou lze použít pouze pro čtení [6]
Ilustrativní příklad PoleLidiVypisFor
Program PoleLidiVypisFor
- Popis: Výpis obsahu všech prvků jednorozměrného pole obsahující celá čísla pomocí cyklu s krokem
- Zadání: Vytvořte instanci jednorozměrného celočíselného pole o 5 prvcích: 7, 5, 2, 4, 9. Instance se bude jmenovat poctyLidi. Vypište v metodě Main hodnoty všech prvků instance poctyLidi pomocí cyklu s krokem
- Řešení: Bude postupně probráno v následujícím textu
Pro výpis všech prvků je vhodné použít cyklus for, poněvadž víme, že proběhne tolik iterací s příkazem
výpisu obsahu prvku, kolik je prvků v poli. Proto jsme využili
v podmínce cyklu vlastnost Length,
která nám vrací počet prvků, v našem případě jednorozměrného pole. Postačí
nám tedy pouze jeden čítač (proměnná indexPrvku)
– viz Kód 1.
static void Main(string[] args) { //Vytvoření instance pole o 5 prvcích včetně inicializace int[] poctyLidi = { 7, 5, 2, 4, 9 }; //Cyklus s krokem pro procházení prvků pole for (int indexPrvku = 0; indexPrvku < poctyLidi.Length; indexPrvku++) { //Výpis hodnoty prvku jednorozměrného pole na základě indexu Console.WriteLine("Prvek na pozici {0} má hodnotu: {1}", indexPrvku, poctyLidi[indexPrvku]); } //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 1: Výpis obsahu prvků jednorozměrného pole poctyLidi obsahujícího celá čísla včetně pozic prvků
Na výpisu v konzoli vidíme výpis pozic a obsahu prvků
jednorozměrného pole – viz Výstup programu - Kód 1.
Prvek na pozici 0 má hodnotu: 7
Prvek na pozici 1 má hodnotu: 5
Prvek na pozici 2 má hodnotu: 2
Prvek na pozici 3 má hodnotu: 4
Prvek na pozici 4 má hodnotu: 9
Výstup programu - Kód 1: Příklad výpisu obsahu prvků jednorozměrného pole včetně pozic prvků
Ilustrativní příklad PoleLidiVypisForeach
Program PoleLidiVypisForeach
- Popis: Výpis obsahu všech prvků jednorozměrného pole obsahující celá čísla pomocí cyklu foreach
- Zadání: Vytvořte instanci jednorozměrného celočíselného pole o 5 prvcích: 7, 5, 2, 4, 9. Instance se bude jmenovat poctyLidi. Vypište v metodě Main hodnoty všech prvků instance poctyLidi pomocí cyklu foreach
- Řešení: Bude postupně probráno v následujícím textu
Výhoda cyklu foreach je na rozdíl od cyklu for v úspoře kódu (za podmínek že nepotřebujeme vypisovat aktuální indexy prvků). V cyklu je definován stejný datový typ int řídící proměnné, jako je datový typ prvků pole. Do této proměnné je uložena hodnota aktuálního prvku. Tuto proměnnou jsme pojmenovali pocet. Obsah tohoto prvku následně využíváme v těle cyklu při výpisu WriteLine – viz Kód 2.
static void Main(string[] args) { //Vytvoření instance pole o 5 prvcích včetně inicializace int[] poctyLidi = { 7, 5, 2, 4, 9 }; //Cyklus s krokem pro procházení prvků pole foreach (int pocet in poctyLidi) { //Výpis hodnoty prvku jednorozměrného pole Console.WriteLine("Prvek má hodnotu: {0}", pocet); } //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 2: Výpis obsahu prvků jednorozměrného pole poctyLidi obsahujícího celá čísla bez pozic prvků
Na výpisu v konzoli vidíme pouze výpis obsahu prvků jednorozměrného
pole – viz Výstup programu - Kód 2.
Prvek má hodnotu: 7
Prvek má hodnotu: 5
Prvek má hodnotu: 2
Prvek má hodnotu: 4
Prvek má hodnotu: 9
Výstup programu - Kód 2: Příklad výpisu obsahu prvků jednorozměrného pole bez pozic prvků
Využijme předchozího příkladu deklarace implicitně typovaného jednorozměrného pole nazvané lide s instancemi anonymní třídy – viz ilustrativní příklad ImplicitneTypovanePoleLidi v kapitole Implicitně typovaná pole.
Ilustrativní příklad ImplicitneTypovanePoleLidiVypis
Program ImplicitneTypovanePoleLidiVypis
- Popis: Vytvoření jednorozměrného implicitně typovaného pole s instancemi anonymní třídy, výpis obsahu prvků pole
- Zadání: Deklarujte implicitně typované pole nazvané lide. Jednotlivé prvky pole jsou instancemi anonymní třídy. Třída obsahuje datové složky:
- Jmeno – jméno člověka (datový typ string). Jednotlivá jména: "Petr", "Jan", "Pavel", "Zdeněk"
- Vek – věk člověka (datový typ int). Věk lidí: 39, 67, 38, 45
V metodě Main vypište hodnoty všech prvků instance lide pomocí cyklu foreach. Řídící proměnnou tohoto cyklu nazvěte clovek
- Řešení: Bude postupně probráno v následujícím textu
Jednotlivé prvky pole jsou instancemi anonymní třídy, která obsahuje datové složky Jmeno a Vek. V cyklu foreach pro procházení jednotlivých prvků implicitně typovaného pole lide je deklarována implicitně typovaná proměnná řídícího cyklu nazvaná clovek, v níž je uložena hodnota aktuálního prvku, tj. právě procházená instance anonymní třídy. V této instanci jsou uloženy hodnoty datových složek. Jednotlivé hodnoty datových složek (k nimž přistupujeme pomocí tečkové notace u deklarované instance anonymní třídy) jsou vypisovány pomocí příkazu WriteLine – viz Kód 3.
static void Main(string[] args) { //Vytvoření instance implicitně typovaného pole s instancemi anonymní třídy var lide = new[] { new { Jmeno = "Petr", Vek = 39 }, new { Jmeno = "Jan", Vek = 67 }, new { Jmeno = "Pavel", Vek = 38 }, new { Jmeno = "Zdeněk", Vek = 45 } }; //Cyklus s krokem pro procházení prvků implicitně typovaného pole foreach (var clovek in lide) { //Výpis hodnoty prvku jednorozměrného pole Console.WriteLine("Jméno: {0}, věk: {1}", clovek.Jmeno, clovek.Vek); } //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 3: Výpis obsahu datových složek instancí anonymní třídy umístěných v jednorozměrném poli
Na výpisu v konzoli vidíme výpis datových složek prvků
jednorozměrného pole. Tyto prvky jsou tvořeny instancemi třídy lide – viz Výstup programu - Kód 3.
Jméno: Petr, věk: 39
Jméno: Jan, věk: 67
Jméno: Pavel, věk: 38
Jméno: Zdeněk, věk: 45
Výstup programu - Kód 3: Výpis obsahu datových složek instancí anonymní třídy umístěných v jednorozměrném poli