Úkol kolekce objektů obsahující kolekce objektů

Stránky: Moodle ZČU
Kurz: BP Luboš Dokulil Sada rozšiřujících úloh v Blazor pro předmět Programování 2
Kniha: Úkol kolekce objektů obsahující kolekce objektů
Vytiskl(a): Nepřihlášený host
Datum: neděle, 18. října 2026, 13.18

Popis

V zadání úkolu najdete jednoduchý úkol, který objasňuje principy kolekcí objektů vnořených do kolekcí objektů.

1. Zadání úkolu

Co je cílem zadání?

  • Vytvoření tříd Jídlo a Kategorie, kde třída Kategorie obsahuje jako svou vlastnost vnitřní seznam objektů třídy Jídlo.
  • Inicializace datové struktury v paměti vytvořením instancí kategorií, naplněním jejich seznamů konkrétními jídly a vložením do hlavního jídelního lístku.
  • Zobrazení hierarchických dat na stránce pomocí dvou vnořených cyklů, kde vnější cyklus vypisuje kategorie a vnitřní cyklus tvoří tabulku s příslušnými jídly.
  • Automatické zjištění a vypsání počtu položek obsažených uvnitř každé jednotlivé zobrazené kategorie.

Zadání

Vytvořte třídu Jídlo, která bude reprezentovat konkrétní pokrm a bude mít vlastnosti Název a Cena. Dále vytvořte třídu Kategorie, která bude sloužit jako sekce menu (např. Polévky, Hlavní jídla) a bude obsahovat vlastnost NázevKategorie a kolekci objektů typu Jídlo.

V Razor komponentě vytvořte hlavní seznam (jídelní lístek), který bude uchovávat jednotlivé kategorie jídel. V metodě pro inicializaci naplňte tento seznam alespoň dvěma kategoriemi, přičemž každá kategorie bude obsahovat několik položek jídel.

Následně vypište celé menu na stránku. Aplikaci naprogramujte tak, abyste pomocí vnořených cyklů vypisovala vždy nadpis kategorie a pod ním tabulku se seznamem jídel, která do dané kategorie patří.

Příklad, jak by mohla stránka vypadat:

Pokud se okno nenačetlo, klikněte zde.

2. Grafická nápověda

Logika kolekcí

Hlavní seznam (Válec nahoře): Představuje kořenovou proměnnou jidelniListek. Je to nadřazený kontejner typu List, který v paměti drží jednotlivé objekty kategorií.

Objekty Kategorie (Střední úroveň): Jedná se o instance třídy Kategorie (např. "Polévky" nebo "Hlavní jídla"). Každý tento box funguje jako spojovací článek – nese informaci o svém názvu a zároveň obsahuje svůj vlastní vnitřní seznam jídel.

Objekty Jídlo (Spodní úroveň): Konkrétní instance třídy Jidlo (např. "Svíčková"). Tyto objekty jsou vnořeny hluboko ve struktuře; nejsou přístupné přímo z hlavního seznamu, ale vždy pouze skrze svou nadřazenou kategorii.

Mechanismus procházení:

  • 1. Vnější cyklus (Horní šipky): Tento krok prochází hlavní seznam kategorií. Slouží k tomu, abychom se dostali ke každému "boxu" Kategorie a mohli vypsat jeho název jako nadpis sekce.

  • 2. Vnitřní cyklus (Spodní šipky): Jakmile se vnější cyklus zastaví na konkrétní kategorii, spustí se tento vnitřní cyklus. Ten projde seznam List<Jidlo> uvnitř této kategorie a vykreslí jednotlivé řádky s názvem jídla a cenou.

3. Řešení úkolu

Třída Jídlo

namespace kolekce_objektu_obsahujici_kolekce_objektu.Models
{
    public class Jidlo
    {
        public string Nazev { get; set; } = "";
        public int Cena { get; set; }
    }
}

Třída Jidlo slouží jako základní datový model pro konkrétní pokrm. Definuje vlastnost Nazev a Cena, které musí mít každá jednotlivá položka v menu. Instance této třídy budou tvořit nejnižší úroveň naší datové struktury.


Třída Kategorie

namespace kolekce_objektu_obsahujici_kolekce_objektu.Models
{
    public class Kategorie
    {
        public string NazevKategorie { get; set; } = "";
        public List<Jidlo> SeznamJidel { get; set; } = new List<Jidlo>(); //Seznam, do kterého se budou ukládat jednotlivé instance třídy Jídlo
    }
}

Třída Kategoriepředstavuje vyšší úroveň hierarchie. Kromě názvu kategorie obsahuje klíčovou vlastnost SeznaJidel, což je kolekce objektů typu List<Jidlo>. Hlavní princip: Jeden objekt (Kategorie) v sobě obsahuje celý seznam jiných objektů (Jídel).


Razor komponenta

@page "/"
 
<PageTitle>Jídelní lístek</PageTitle>
 
<h1>Naše Menu</h1>
 
@foreach (var kategorie in jidelniListek)   //Cyklus, který postupně projede všechny zápisy v seznamu jidelniListek
{
    <div class="mt-4 p-3 bg-light border rounded">
        <h2 class="text-primary">@kategorie.NazevKategorie</h2> <!--Výpis názvů kategorií-->
 
        <table class="table table-sm">  <!--Tabulka pro výpis kategorií a jídel-->
            <thead>
                <tr>
                    <th>Název jídla</th>
                    <th>Cena</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var jidlo in kategorie.SeznamJidel)   //Vnořený cyklus, který pro každou kategorii vypíše seznam položek, které obsahuje
                {
                    <tr>
                        <td>@jidlo.Nazev</td>
                        <td>@jidlo.Cena Kč</td>
                    </tr>
                }
            </tbody>
        </table>
 
        <p><em>Počet jídel v této sekci: @kategorie.SeznamJidel.Count</em></p>  <!--Metoda .Count(), která spočítá počet položek v seznamu-->
    </div>
}
 
@code {
    private List<Models.Kategorie> jidelniListek = new List<Models.Kategorie>(); //Seznam, do kterého se budou ukládat jednotlivé instance třídy Kategorie
 
    protected override void OnInitialized()
    {
        var polevky = new Models.Kategorie { NazevKategorie = "Polévky" };  //Vytvoření instance třídy Kategorie pro sekci Polévky
        
        polevky.SeznamJidel.Add(new Models.Jidlo { Nazev = "Vývar", Cena = 45 });   //Vytvoření instancí třídy Jídlo a následné přidání pomocí metody .Add() do seznamu polévky
        polevky.SeznamJidel.Add(new Models.Jidlo { Nazev = "Gulášová", Cena = 55 });
 
        var hlavni = new Models.Kategorie { NazevKategorie = "Hlavní jídla" };  //Vytvoření instance třídy Kategorie pro sekci Hlavní jídla
 
        hlavni.SeznamJidel.Add(new Models.Jidlo { Nazev = "Svíčková", Cena = 180 });    //Vytvoření instancí třídy Jídlo a následné přidání pomocí metody .Add() do seznamu hlavní
        hlavni.SeznamJidel.Add(new Models.Jidlo { Nazev = "Řízek", Cena = 150 });
        hlavni.SeznamJidel.Add(new Models.Jidlo { Nazev = "Salát Caesar", Cena = 140 });
 
        jidelniListek.Add(polevky); //Přidání hotových kategorií do hlavního seznamu
        jidelniListek.Add(hlavni);
    }
}

V HTML části využíváme vnořených cyklů (cyklus v cyklu):

Vnější cyklus: Prochází hlavní seznam kategorií. Pro každou kategorii vytvoří nový oddíl na stránce a vypíše její nadpis.

Vnitřní cyklus: Nachází se uvnitř vnějšího cyklu. Prochází pouze seznam jídel aktuální kategorie a vypisuje je do tabulky. Díky tomu se jídla nepomíchají a zůstanou logicky seřazena pod svými nadpisy. Vlastnost .Count nám na konci sekce automaticky spočítá, kolik jídel daná kategorie obsahuje.

části @code pracujeme s hlavním seznamem jidelniListek. Postup plnění dat je následující: Vytvoříme instanci kategorie (např. polevky). Do jejího vnitřního seznamu .SeznamJidel přidáme konkrétní jídla pomocí metody .Add(). Až je kategorie naplněná jídly, přidáme ji celou do hlavního jidelniListek. Tento proces opakujeme pro každou sekci menu.