Základní typy kolekcí
Typy kolekcí (klasické):
- ArrayList
- SortedList – setříděná kolekce uchovávající páry (jméno / hodnota) objektů
- Queue – fronta
- Stack – zásobník
- Hashtable – kolekce uchovávající páry (klíč / hodnota) objektů
- BitArray – kolekce boolean(true, false) hodnot
- StringCollection – kolekce řetězců
- StringDictionary – kolekce uchovávající páry (jméno / hodnota) řetězců
- ListDictionary – efektivní kolekce pro uchovávání malého množství dat
- HybridDictionary – Když je počet položek v kolekci malý, využívá se ListDictionary. V případě, že je položek velký, využívá se hashtable
- NameValueCollection – kolekce uchovávající páry (jméno / hodnota) řetězců
ArrayList - demo (v ukázce si ukážeme základní metody a vlastnosti ArrayListu)
Pár základních metod a vlastností ArrayListu:
- int Add(object value) - přidá objekt do kolekce. Objekt může být null
- void AddRange(ICollection c) - přidá pole do kolekce
- void Insert(int index, object value) - přidá objekt na konkrétní pozici
- void InsertRange(int index, ICollection c) - přidá pole na konkrétní pozici
- int BinarySearch(object value) - vrátí pozici vyhledávaného objektu v kolekci
- int IndexOf(object value) - vrátí pozici vyhledávaného objektu v kolekci
- void Clear() - vymaže všechny elementy v kolekci
- object Clone() - vytvoří mělkou kopii kolekce
- bool Contains(object value) - vrátí true nebo false, jestli se objekt nachází v kolekci
- void CopyTo(Array array) - zkopíruje obsah kolekce do jednorozměrného pole
- IEnumerator GetEnumerator() - vráti enumerator
- ArrayList GetRange(int index, int count) - vrátí ArrayList obsahující elementy od pozice index a o velikosti count
- void Remove(object value) - odebere první výskyt objektu z kolekce
- void RemoveAt(int index) - odebere objekt z konkrétní pozice
- void RemoveRange(int index, int count) - odebere elementy začínající na pozici index o velikosti count
- void Reverse() - obrátí kolekci (prvky, které byly na začátku budou na konci)
- void Sort() - setřídí elementy v kolekci
- void TrimToSize() - nastaví kapacitu kolekce na aktuální počet prvků v kolekci
- int Capacity - určuje kolik elementů může kolekce uchovávat. Pokud bude ovšem počet prvků v kolekci větší než kapacita, dojde ke dvojnásobnému zvětšení
- int Count - udává počet elementů v kolekci
- bool IsReadOnly - určuje zda-li je kolekce jenom pro čtení
// Vytvorim si novy ArrayList s kapacitou 4
ArrayList mujArrayList = new ArrayList(4);
mujArrayList.Add("string");
mujArrayList.Add(8);
mujArrayList.Add(new ArrayList());
mujArrayList.Add(null);
object[] pole = new object[] { "string", 8, 9.5, new ArrayList(), null };
mujArrayList.AddRange(pole);
mujArrayList.Insert(1, 9);
mujArrayList.InsertRange(4, pole);
mujArrayList[0] = "novy string";
// ArrayList muzeme prochazet tremi zpusoby
// pomoci cyklu for
for (int i = 0; i < mujArrayList.Count; i++)
{
Console.Write(mujArrayList[i] + ",");
}
// pomoci iteratoru
IEnumerator enumerator = mujArrayList.GetEnumerator();
while (enumerator.MoveNext())
{
Console.Write(enumerator.Current + ",");
}
// pomoci cyklu foreach
foreach (object o in mujArrayList)
{
Console.Write(o + ",");
}
// otocim kolekci
mujArrayList.Reverse();
// jestlize je v kolekci null, odeberu jeho prvni vyskyt
if (mujArrayList.Contains(null))
mujArrayList.Remove(null);
|
Zde si ukážeme příklad jak si "vzít třídění do vlastních rukou". Představte si, že máme třídu Osoba uchovávající údaje jako je jméno, příjmení a věk. Námi vytvořený ArrayList bude obsahovat několik objektů typu Osoba a my je budeme chtít setřídit podle věku. Jak na to ?
Vytvoříme si třídu Osoba implemetující rozhraní IComparer:
public class Osoba : IComparer
{
private string m_Jmeno;
private string m_Prijmeni;
private int m_Vek;
public Osoba(string jmeno, string prijmeni, int vek)
{
this.m_Jmeno = jmeno;
this.m_Prijmeni = prijmeni;
this.m_Vek = vek;
}
public Osoba()
{ }
public string Jmeno
{
get { return m_Jmeno; }
set { m_Jmeno = value; }
}
public string Prijmeni
{
get { return m_Prijmeni; }
set { m_Prijmeni = value; }
}
public int Vek
{
get { return m_Vek; }
set { m_Vek = value; }
}
public int Compare(object x, object y)
{
// objekty x a y pretypujeme na objekt
// typu osoba a zjistime si vek
int xVek = (x as Osoba).m_Vek;
int yVek = (y as Osoba).m_Vek;
if (xVek > yVek)
return 1;
else if (xVek < yVek)
return -1;
// veky si jsou rovny
return 0;
}
}
|
Nyní v metodě main pouze vytvoříme několik objektů typu Osoba a vložíme je do naší kolekce. Při zavolání metody Sort pro setřídění kolekce, předáme jako parametr novou instanci třídy Osoba (jelikož implementuje rozhraní IComparer, které obsahuje metodu Compare). Naše implemetace metody Compare nám zajistí, že osoby budou setříděny vzestupně. Pokud bychom chtěli sestupné setřídění, akorát by jsme prohodili x za y.
static void Main(string[] args)
{
Osoba o1 = new Osoba("Lojza", "Natvrdly", 32);
Osoba o2 = new Osoba("Pepa", "Novy", 24);
Osoba o3 = new Osoba("Martin", "Noha", 14);
Osoba o4 = new Osoba("Lukas", "Kubis", 20);
ArrayList osoby = new ArrayList();
osoby.Add(o1);
osoby.Add(o2);
osoby.Add(o3);
osoby.Add(o4);
osoby.Sort(new Osoba());
}
|
Queue - demo (v ukázce si ukážeme základní metody a vlastnosti fronty)
Pár základních metod fronty:
- void Enqueue(object obj) - přidá objekt do fronty
- object Dequeue() - vrátí a zároveň odebere objekt z fronty
- object Peek() - pouze vrátí objekt ze začátku fronty. Neodebírá ho !!!
static void Main(string[] args)
{
Queue fronta = new Queue();
// ve fronte bude 5
fronta.Enqueue(5);
// ve fronte bude 5,6
fronta.Enqueue(6);
// z fronty odeberu prvni prvek, tedy 5
Console.WriteLine(fronta.Dequeue());
// zobrazim si prvek ze zacatku fronty, tedy 6
Console.WriteLine(fronta.Peek());
}
|
Stack - demo (v ukázce si ukážeme základní metody a vlastnosti zásobníku)
Pár základních metod zásobníku:
- void Push(object obj) - přidá objekt do zásobníku
- object Pop() - vrátí a zároveň odebere objekt ze zásobníku
- object Peek() - pouze vrátí objekt z vrcholu zásobníku. Neodebírá ho !!!
static void Main(string[] args)
{
Stack zasobnik = new Stack();
// v zasobniku bude 5
zasobnik.Push(5);
// v zasobniku bude 6,5
zasobnik.Push(6);
// ze zasobniku odeberu naposledy
// vlozeny prvek, tedy 6
Console.WriteLine(zasobnik.Pop());
// zobrazim si prvek z vrcholu
// zasobniku, tedy 5
Console.WriteLine(zasobnik.Peek());
}
|