Generická třída znamená, že při jejím použití krom jejího jména uvádíme i tzv. generické parametry, což jsou datové typy, se kterými bude generická třída pracovat. V prvním ze sedmi příspěvků o generických kolekcích vestavěných v .NET Frameworku si probereme seznam System.Collections.Generic.List<T>. Předáváme mu jeden generický pametr (písmeno T ve špičatých závorkách), což je určení datového typu, kterým můžeme seznam plnit.
List funguje jako běžná kolekce, do které můžeme vkládat položky, mazat a odkazovat se do něj jako do pole běžným číselným indexem. Jedná se o jednu z nejužitečnějších tříd v .NET Frameworku. V příkladu si nadefinujeme seznam s generickým typem String (tedy na vkládání řetězců) a ukážeme si několik z řady funkcí, kterými můžeme seznam obsluhovat. Kód ve VB.NET:
' deklarace a inicializace seznam typu "String", který bude sloužit pro ukládání textů
Dim seznam As New System.Collections.Generic.List(Of String)()
' pridat 3 polozky
seznam.Add("Polozka 1")
seznam.Add("Polozka 2")
seznam.Add("Polozka 3")
seznam.Remove("Polozka 2") ' odstranit polozku ekvivalentni textu "Polozka 2"
seznam.Insert(0, "Polozka 0") ' vlozit novou polozku na zacatek
seznam.RemoveAt(2) ' odebrat polozku s indexem 2
seznam.Reverse() ' obratit poradi polozek v seznamu
seznam.Sort() ' seradi polozky v seznamu
Console.WriteLine(seznam(1)) ' vypsat polozku na pozici 1
' projit vsechny polozky seznamu
For Each polozka As String In seznam
Console.WriteLine(polozka)
Next
' zjistit, zda existuje v seznamu polozka
If seznam.Contains("Polozka 0") Then
Console.WriteLine("Seznam obsahuje polozku 'Polozka 0'!")
End If
' zjistit pocet polozek
Console.WriteLine("Pocet polozek v seznamu: {0}", seznam.Count)
A v C#:
// deklarace a inicializace seznam typu "String", který bude sloužit pro ukládání textů
System.Collections.Generic.List<String> seznam = new System.Collections.Generic.List<String>();
// pridat 3 polozky
seznam.Add("Polozka 1");
seznam.Add("Polozka 2");
seznam.Add("Polozka 3");
seznam.Remove("Polozka 2"); // odstranit polozku ekvivalentni textu "Polozka 2"
seznam.Insert(0, "Polozka 0"); // vlozit novou polozku na zacatek
seznam.RemoveAt(2); // odebrat polozku s indexem 2
seznam.Reverse(); // obratit poradi polozek v seznamu
seznam.Sort(); // seradi polozky v seznamu
Console.WriteLine(seznam[1]); // vypsat polozku na pozici 1
// projit vsechny polozky seznamu
foreach (string polozka in seznam)
{
Console.WriteLine(polozka);
}
// zjistit, zda existuje v seznamu polozka
if(seznam.Contains("Polozka 0"))
Console.WriteLine("Seznam obsahuje polozku 'Polozka 0'!");
// zjistit pocet polozek
Console.WriteLine("Pocet polozek v seznamu: {0}", seznam.Count);
Všimněte si, že ve VB.NET se generický třída používá ve formátu:
List(Of String)
V v C# je to:
List<string>
Nespornou výhodou generických kolekcí je především fakt, že jsou silně typové. Tedy funkce Add přebírá jen parametr toho typu, který jsme předali jako generický parametr při deklaraci třídy a zároveň při čtení ze seznamu získáváme opět přímo požadovaný datový typ. Oproti tomu klasické kolekce a seznamy ve starších programovacích jazycích dokázaly vracet jen netypový object.
V této sérii jsem psal i o následujících třídách:
List
Dictionary
SortedDictionary a SortedList
Queue
Stack
HashSet