.NET Tip #14: Generické kolekce (2/6) - Dictionary

Tomáš Jecha       13. 10. 2008       C#, VB.NET, .NET Tips       7563 zobrazení

V minulém příspěvku jsem psal o generické kolekci List, která dokáže uchovávat položky datového typu, jenž si zvolíme generickým parametrem. Dictionary (neboli slovník) je jí velmi podobný. Liší se jen v tom, že v seznamu List se prvky identifikují podle indexu, který se může měnit v důsledku smazání, či vložení prvku s nižším indexem - vždy se totiž dodržovala posloupnost indexů 0 až počet mínus jedna. Dictionary oproti tomu nepracuje s indexem, ale ukládá prvky pod unikátním klíčem datového typu, který si volíme dalším generickým parametrem.

Vložení nového prvku pak vyžaduje přidání 2 hodnot - nejdříve klíče a potom samotné hodnoty. Také funkce Contains (zjišťující, zda prvek existuje se rozdělila na 2 - ContainsKey a ContainsValue = zjištující, zda existuje ve slovníku daný klíč a zda existuje daná hodnota). Mazání prvku se také provádí pomocí hodnoty klíče.

Krátký příklad použití ve VB.NET (první se při deklaraci uvádí typ klíče a jako druhý typ hodnoty - v našem příklad klíč je číslo zaměstnance a hodnota jména):

' vytvoření slovníku s klíčem typu INT a hodnotou typu STRING 
Dim jmena As New Dictionary(Of Integer, String)()

' přidání hodnot do kolekce (klíč je interéní číslo zaměstnance, hodnota pak jméno 
jmena.Add(18, "Karel Novák")
jmena.Add(420, "Petr Gulis")
jmena.Add(135, "Martina Bláhová")

' získání hodnoty pro klíč 18 
Console.WriteLine("Zaměstnance číslo 18: {0}", jmena(18))

' získání hodnoty pro klíč 135 
Console.WriteLine("Zaměstnance číslo 135: {0}", jmena(135))

' zjištění, zda existuje položka s klíčem 555 
If jmena.ContainsKey(555) = False Then
    Console.WriteLine("Zaměstnanec s číslem 555 neexistuje!")
Else
    Console.WriteLine("Zaměstnanec s číslem 555 je ve slovníku!")
End If

A v C#:

// vytvoření slovníku s klíčem typu INT a hodnotou typu STRING
Dictionary<int, string> jmena = new Dictionary<int, string>();

// přidání hodnot do kolekce (klíč je interéní číslo zaměstnance, hodnota pak jméno
jmena.Add(18, "Karel Novák");
jmena.Add(420, "Petr Gulis");
jmena.Add(135, "Martina Bláhová");

// získání hodnoty pro klíč 18
Console.WriteLine("Zaměstnance číslo 18: {0}", jmena[18]);

// získání hodnoty pro klíč 135
Console.WriteLine("Zaměstnance číslo 135: {0}", jmena[135]);

// zjištění, zda existuje položka s klíčem 555
if (jmena.ContainsKey(555) == false)
    Console.WriteLine("Zaměstnanec s číslem 555 neexistuje!");
else
    Console.WriteLine("Zaměstnanec s číslem 555 je ve slovníku!");

Na závěr chci ještě dodat způsob procházení slovníku cyklusem foreach. Máme 3 možnosti:

  1. Procházet jen hodnoty (bez klíčů):
    For Each hodnota As String In jmena.Values
        Console.WriteLine("Hodnota: {0}", hodnota)
    Next
  2. Procházet jen klíče:
    For Each klic As String In jmena.Keys
        Console.WriteLine("Klíč: {0}", klic)
    Next
  3. Procházet hodnoty i klíče pomocí datového typu KeyValuePair(Of TypKlíče, TypHodnoty) - ten má pak vlastnosti Key a Value:
    For Each polozka As KeyValuePair(Of Integer, String) In jmena
        Console.WriteLine("Pro klíč {0} odpovídá hodnota: {1}", polozka.Key, polozka.Value)
    Next

V této sérii jsem psal i o následujících třídách:

  • List
  • Dictionary
  • SortedDictionary a SortedList
  • Queue
  • Stack
  • HashSet
  •  

    hodnocení článku

    0       Hodnotit mohou jen registrované uživatelé.

     

    Nový příspěvek

     

                           
    Nadpis:
    Antispam: Komu se občas házejí perly?
    Příspěvek bude publikován pod identitou   anonym.

    Nyní zakládáte pod článkem nové diskusní vlákno.
    Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

    Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

     

    • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
      Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
    • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

    přihlásit pomocí externího účtu

    přihlásit pomocí jména a hesla

    Uživatel:  
    Heslo:  

    zapomenuté heslo

     

    založit nový uživatelský účet

    zaregistrujte se

     
    zavřít

    Nahlásit spam

    Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

    Nahlásit Zrušit

    Chyba

    zavřít

    feedback