Kolekce v C# slouží k práci s větším množstvím objektů stejného typu. Je jich mnoho druhů a každý se hodí k něčemu trochu jinému. V dnešním videu z série C# pro mírně pokročilé se na ně podíváme trochu důkladněji.

Přijímáme kolekce

Pokud jsme na straně příjemce dat v podobě kolekcí, tj. dostáváme nějaký typ kolekce jako argument, je vhodné nepožadovat nějaký konkrétní typ, ale spokojit se s jedním ze tří rozhraní, které typy kolekcí implementují.

Nejjednodušší je rozhraní IEnumerable<T>. Pokud kolekce podporuje toto rozhraní, umožní nám enumerovat objekty, tedy projít jeden za druhým. Má jakýsi kurzor, který vrací aktuální objekt, metodu umožňující posunout ho na další prvek a metodu umožňující kurzor resetovat na začátek. Na jednotlivé členy kolekce se nelze přímo odkazovat ani nelze její obsah modifikovat. Ale pro řadu scénářů je prosté IEnumerable<T> zcela postačující.

O stupeň výše je rozhraní ICollection<T>. Kromě toho že implementuje IEnumerable<T>, umožňuje kolekci i modifikovat přidáváním (Add) a odebíráním (Remove) položek, případně všechny položky smazat (Clear). Také umí vrátit počet položek a pár dalších věcí.

Nejschopnější z této trojice je IList<T>. Umí vše co ICollection<T> a IEnumerable<T>, ale navíc umí k jednotlivým položkám přistupovat na základě jejich indexu, přidávat je na konkrétní pozici v seznamu atd.

Pro úplnost zmiňme rozhraní IQueryable<T>. To ovšem nemá nic společného s klasickými kolekcemi, ale umožňuje dotazovat se do externích zdrojů dat s využitím jejich vlastních metod filtrování, řazení apod. Např. do relační databáze, kdy se C# zápis převede do příslušného dialektu jazyka SQL.

Používáme kolekce

Sami si pravděpodobně typy implementující shora uvedená rozhraní vytvářet nebudete, na výběr je z mnoha hotových možností. Liší se schopnostmi a zejména algoritmickou složitostí práce s jednotlivými položkami. Potřebné informace najdete v článku o nich na docs.microsoft.com. Nejjednodušší kolekci nejspíše představuje HashSet<T>. Nejuniverzálnější a nejschopnější je IList<T>.

Fronta a zásobník

Speciální druh kolekcí představuje fronta Queue<T> a zásobník Stack<T>. Fronta představuje úložiště typu FIFO (first in, first out). Do fronty se postupně metodou Enqueue přidávají položky a metodou Dequeue se odebírají v tom pořadí, v jakém přišly. Zásobník je naopak úložiště typu LIFO (last in, first out). Pomocí metody Push vložíme položku na vrchol zásobníku a pomocí metody Pop vyjmeme položku, která se na vrcholu nachází.