Úkol kolekce objektů obsahující kolekce objektů
V zadání úkolu najdete jednoduchý úkol, který objasňuje principy kolekcí objektů vnořených do kolekcí objektů.
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.