Poznáváme C# a Microsoft.NET 25. díl - třídy kolekcí

Tento díl bude úvodem do problematiky o třídách představujících datové struktury pro ukládání různých hodnot, které nám jsou k dispozici v základní knihovně tříd prostředí Microsoft.NET framework. Tyto třídy jsou navrženy pro ulehčení práce programátorů a nazývají se třídy kolekcí. Dnes si povíme o co se vlastně jedná a seznámíme se s hojně využívanou třídou ArrayList.

Třídy kolekcí a jmenný prostor System.Collections

Během našeho poznávání světa Microsoft.NET frameworku jsme doposud narazili pouze na jedinou datovou strukturu, kterou jsme mohli využít pro ukládání různých druhů objektů a to pod takzvanými indexy. Nemám na mysli nic jiného, než základní datovou strukturu - pole. Určitě vás napadlo, že byste při vašem vývoji použili i nějaké jiné, řekněme flexibilnější, datové struktury do kterých byste si „nastrkali“ objekty, a to ne nutně tak, aby byli přístupné pomocí indexů.

Základní knihovna tříd (Base Class Library) prostředí Microsoft.NET frameworku v podobě tříd kolekcí, které jsou obsaženy ve jmenném prostoru System.Collections. V tomto jmenném prostoru tedy nalezneme třídy  rozhraní představující rozličné listy, fronty, bitová pole, hešové tabulky a takzvané slovníky. Na třídách kolekcí lze provádět různá řazení hodnot v nich obsažených a také je nám umožňeno definovat vlastní způsoby řazení.

Třída ArrayList

Tato kolekce reprezentuje list hodnot, jehož kapacita je automaticky zvětšována podle potřeby. To znamená, že pokud přidáváme prvek do této struktury a stávající kapacita listu již není dostačující, tak je kapacita zvětšena. Třída ArrayList mimo jiné implementuje rozhraní IList z jmenného prostoru System.Collections, které definuje vlastnosti a operace pro kolekce objektů, k nimž lze přistupovat individuálně podle indexů.

Počáteční kapacita může být určena při vytváření instance této třídy formou parametru konstruktoru, pokud tak neučiníme bude pro kapacita použita výchozí hodnota, která je 16. Kapacita listu může také být později explicitně nastavena využitím instanční vlastnosti Capacity. S kapacitou ArrayListu souvisí také metoda TrimToSize, která kapacitu listu změní na velikost potřebnou pro agregované prvky.

Prvky jsou do této struktury přidávány pomocí metody Add, která očekává jako parametr instanci typu System.Object, což znamená, že tato datová struktura může obsahovat objekty jakéhokoli typu. K získávání, ale i k modifikaci,  agregovaných objektů slouží vlastnost Item, která je v jazyce C# implementována jako indexer. Indexy jsou, stejně jako u pole, číslovány od nuly.  Použitím metody Add jsou prvky přidávány na konec listu. Pokud potřebujeme vložit prvek na specifikovaný index, naskýtá se nám možnost použít metodu Insert, které kromě vkládaného prvku předáme onen index.

Následující příklad ukazuje základní použití datové struktury ArrayList.

public class ArrayListExam
{
 public static void Priklad()
 {
  file://inicialize listu bez udani kapacity
  ArrayList lMujList = new ArrayList();
  lMujList.Add("Poznavame ");
  lMujList.Add(".NET");
  file://vlozeni prvku na urcity index
  lMujList.Insert(1,"Microsoft");
  VypisHodnotyPomociFor(lMujList);
 }      
  
 /// <summary>
 /// Vypise vsechny prvky listu pouzitim cyklu for a indexeru
 /// definovaneho na tride ArrayList
 /// </summary>
 public static void VypisHodnotyPomociFor(ArrayList ListProVypsani)
 {
  for (int i = 0; i < ListProVypsani.Count;i++)
   Console.Write(ListProVypsani[i]);
 }
}

V uvedeném přikladu je obsah ArrayListu vypsán pomocí metody, která ho iteruje pomocí cyklu for a využívá zmíněného indexeru. Jelikož tato kolekce implementuje rozhraní System.Collections.IEnumerable je možné použít, dle mého názoru, elegantnější metodu průchodu a použít cyklu foreach.

public class VypisKolekci
{
 public static void VypisHodnoty(IEnumerable KolekceProVypsani)
 {
  foreach(object lZaznam in KolekceProVypsani)
  Console.Write("{0}, ",lZaznam);
  Console.WriteLine();
 }
}

Využití metody VypisHodnoty této miniaturní třídy tedy představuje ono druhé, elegantnější řešení. Mimo jiné je možné, díky tomu, že metoda očekává parametr typu rozhraní , tuto metodu použít pro výpis obsahu jakékoli kolekce, která toto rozhraní implementuje.

Prvky ArrayListu jsou odebírany použitím metody Remove, které jako vstupní parametr předáme objekt, který má být z instance listu vyjmut. Přesněji řečeno, bude z ArrayListu odebrán první výskyt specifikovaného objektu. V případě, že budeme chtít z listu odebrat prvek na požadovaném indexu použijeme k tomu metodu RemoveAt, která tento index očekává jako parametr. Metoda Clear této datové struktury odebere všechny elementy, které obsahuje, takže není nutné použití průchodu nějakým cyklem. Užitečná je také metoda Contains, vracející hodnotu typu bool, která je true v případě, že objekt předaný této metodě je v listu obsažen.

public class ArrayListExam2
{
 public static void Priklad()
 {
  file://pocatecni kapacitu listu nastavime na 5
  ArrayList lMujList = new ArrayList(5);
  NaplnList(lMujList);
  lMujList.Add("Dalsi prvek");
  lMujList.Add("A zase dalsi prvek");
  VypisKolekci.VypisHodnoty(lMujList);
  lMujList.Remove("Dalsi prvek");
  lMujList.RemoveAt(0);
  Console.WriteLine("Obsah listu po vyjmuti prvku :");
  VypisKolekci.VypisHodnoty(lMujList);
  file://odebrani vsech prvku z kolekce
  lMujList.Clear();
 }

 public static void NaplnList(ArrayList ListProNaplneni)
 {
  for(int i = 0; i < ListProNaplneni.Capacity; i++)
   ListProNaplneni.Add("Prvek " + i);
 }
}

Po spuštění uvedeného příkladu uvidíme následující výstup:

Prvek 0, Prvek 1, Prvek 2, Prvek 3, Prvek 4, Dalsi prvek, A zase dalsi prvek,
Obsah listu po vyjmuti prvku:
Prvek 1, Prvek 2, Prvek 3, Prvek 4, A zase dalsi prvek,

Zdrojové kódy k ukázkovým příkladům najdete zde.

V příštím díle se seznámíme s dalšími třídami kolekcí.

Diskuze (7) Další článek: FBI provedla zátah na torrent tracker, který nabízel Pomstu Sithů před uvedením do kin

Témata článku: Microsoft, Software, Programování, Microsoft NET, Základní struktura, TRI, Remove, Vstupní parametr, Díl, Základní knihovna, Index, Public, Základní prvek, Struktura, Software na Heureka.cz



Sex manželských párů? Jen výjimečně. Ložnice ovládnou roboti s umělou inteligencí

Sex manželských párů? Jen výjimečně. Ložnice ovládnou roboti s umělou inteligencí

** Sex manželských párů jen při zvláštních příležitostech. ** Ložnice ovládnou sexuální roboti s umělou inteligencí. ** I to je jeden ze závěrů Mezinárodní robotické konference.

Filip KůželJiří Liebreich
RobotiSexUmělá inteligence
Jak poznat, že máte možná hacknutý telefon? Toto je devět symptomů, které můžete pozorovat

Jak poznat, že máte možná hacknutý telefon? Toto je devět symptomů, které můžete pozorovat

** Jak poznat, že je váš smartphone hacknutý? ** Hledejte známky po nestandardním chování telefonu ** Stačí když telefon vydrží méně nebo topí i v klidovém režimu...

Martin Chroust
Jak...Malware
Recenze cykloradaru Garmin Varia RCT715. Bílé dodávky, všechny si vás natočím

Recenze cykloradaru Garmin Varia RCT715. Bílé dodávky, všechny si vás natočím

** Garmin do svého stále unikátního cykloradaru přidal kameru ** Snímá a ukládá, co se při jízdě děje za sedlem ** Kromě toho je to jedna z nejsilnějších svítilen na kolo

Marek Lutonský
Testy
Datové balíčky pro sociální sítě končí. Operátoři se musí podvolit novým pravidlům EU o síťové neutralitě

Datové balíčky pro sociální sítě končí. Operátoři se musí podvolit novým pravidlům EU o síťové neutralitě

** Od zítřka platí nová pravidla EU o síťové neutralitě ** Operátoři nesmí nabízet datové limity vztažené třeba jen na soc. sítě ** Vodafone už své balíčky nenabízí, Kaktus přestává od zítřka

Martin Chroust
Síťová neutralitaKaktusVodafone
Google není jen vyhledávač: 15 užitečných funkcí, o kterých možná ani nevíte

Google není jen vyhledávač: 15 užitečných funkcí, o kterých možná ani nevíte

** Google umí kromě vyhledávání i spoustu dalších věcí ** Vybrali jsme více než 15 užitečných funkcí a schopností ** Stačí zadat do vyhledávače ta správná klíčová slova

Karel Kilián
TipyVyhledávačeGoogle
Konec otravným hovorům. Od července začne platit zákaz nevyžádaného telemarketingu

Konec otravným hovorům. Od července začne platit zákaz nevyžádaného telemarketingu

** Od 1. července platí novela zákazu omezující otravný telemarketing ** Firmy vás budou moci kontaktovat jen se souhlasem předem ** Úprava se nevztahuje na firmy oslovující své stávající zákazníky

Martin Miksa
TelekomunikaceNevyžádané hovoryČTÚ