Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: felhell
  • Nový dnes Dnes nových 2
  • Nový včera Včera nových: 5
  • Počet uživatelů: Celkem: 4412
Lidé online:
  • Návštěvníci: Návštěvníků: 26
  • Registrovaných Členů: 0
  • Celkem Celkem: 26
Mapa Stranek

MCTS 1. díl - Kolekce

Každý programátor, ať už začátečník či pokročilý narazil na situaci, že potřebuje uchovávat větší množství dat. Existuje mnoho způsobů jak tuto situaci vyřešit a jedním z nich je využít kolekce. .NET Framework poskytuje klasické a generické (typově bezpečné) kolekce.

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());    
}
Lukáš Kubis :: 1. května 2008 :: 1481 shlédnutí :: 0 komentářů
kategorie: Obecná .Net témata

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. Nekultura výlepu plakátů [11.21.2008 8:00 dop.]
    Proč proboha je na FEL ČVUT na Karláku budova polepena plakáty na zdech, přímo na omítce? Vrcholnou ukázkou je zeď před ...
  2. RE: SQL server 2008 MSDN AA [11.11.2008 7:26 odp.]
    Diky, ale tim to bohuzel neni.
  3. Dotaz na organizátory MS Festu [11.10.2008 4:31 odp.]
    Ahoj MSP,rád bych se zeptal jednoho z organizátorů MS Festu na jeden nestandardní dotaz, který se mi nechce psát na veře...
  4. RE: SQL server 2008 MSDN AA [11.08.2008 1:51 odp.]
    Dobrý den,pro spuštění instalace SQL Serveru 2008 je třeba mít nainstalován .NET Framework 3.5 Service Pack 1 - je to uv...
Novinky z klubů

Novinky z klubů

  1. Programátorské večery: Tipy a triky pro Visual Studio 13. listopadu 2008
    S Visual Studiem pracujeme každý den, ale málokdo zná šechny užitečné klávesov...
  2. Programátorské večery: PowerShell 12. listopadu 2008
    Platformu PowerShell již netřeba představovat. Co ovšem přináší pro .NET programátory...
  3. Programátorské večery: Entity Framework 30. října 2008
    Na této akci bude představena technologie Entity Framework. Podíváme se na tato témata: ...
  4. Programátorské večery: LINQ 26. října 2008
    LINQ je nový revoluční přístup pro práci s daty, který přichází s .NET ...
Co se píše jinde

Co se píše jinde

Řešení problémů s identitou webu u Personal Information Cards

Téměř přesně před rokem jsem si v článku Jak se zjišťuje identita webu u Personal Information Cards? stěžoval na to, ...

TechEd Developers 2008: Den druhý až čtvrtý

Konečně jsem získal dostatek času, abych sepsal zážitky z druhého až čtvrtého dne TechEdu.

TechEd Developers 2008: Den první

První den TechEdu je vždycky takový nanečisto, ostatně jsou v něm jenom dva přednáškové sloty. A keynote. Na co že se...

Výběr serveru

Výběr vhodného serveru představuje volbu při níž musíme přihlédnout k mnoha kritériím, které lze shrnout do následují...

Podívejte se své cache na zoubek

Robustní cacheovací mechanismus je jedna z nejužitečnějších technologií, jaké ASP.NET nabízí. Při vhodném použití můž...