.NET Tip #15: Generické kolekce (3/6) - SortedDictionary a SortedList

Tomáš Jecha       14. 10. 2008       C#, VB.NET, .NET Tips       7244 zobrazení

SortedDictionary a SortedList jsou třídy, které obě vychází funkčností (nikoli kódem) z třídy Dictionary. Tedy jedná se o seznam s hodnotou a unikátním klíčem. Při deklaraci se u obou předávají 2 generické parametry (typ klíče a typ hodnoty - stejně jako u Dictionary).

Hlavní funkcí těchto kolekcí je automatické řazení. Každý nový prvek se vkládá už předem seřazený podle klíče. Pokud chceme použít vlastní řazení, předáme konstruktoru instanci třídy IComparer, ale o tom zde psát nebudu.

Viditelný rozdíl mezi SortedDictionary a SortedList je ten, že do SortedList se k položkám může přistupovat i pomocí indexu, nejenom klíče.

Rychlostní a paměťový rozdíl je:

  • SortedList alokuje obecně méně paměti (u velmi nízkého počtu položek je to ale naopak)
  • Při velkém počtu položek trvá vkládání do SortedList často déle
  • Vyhledávání v SortedList trvá kratší dobu
  • Pokud budete mít méně jak 10 000 záznamů, tak předchozí body vůbec neřešte. Rozdíly nejsou tak dramatické.

Příklad použiží obou tříd ve Visual Basic .NET následuje zde:

' vytvoření SortedList a SortedDictionary s klíčem typu INTEGER a hodnotou typu STRING 
Dim jmena As New SortedList(Of Integer, String)
jmena.Add(3, "Jméno v SortedList 3")
jmena.Add(1, "Jméno v SortedList 1")
jmena.Add(2, "Jméno v SortedList 2")

Dim jmena2 As New SortedDictionary(Of Integer, String)
jmena2.Add(3, "Jméno v SortedDictionary 3")
jmena2.Add(1, "Jméno v SortedDictionary 1")
jmena2.Add(2, "Jméno v SortedDictionary 2")

' vypsat položky, které budou seřezené ze SortedList
For Each item As KeyValuePair(Of Integer, String) In jmena
    Console.WriteLine("{0} - {1}", item.Key, item.Value)
Next

' vypsat položky, které budou seřezené ze SortedDictionary
For Each item As KeyValuePair(Of Integer, String) In jmena2
    Console.WriteLine("{0} - {1}", item.Key, item.Value)
Next

' čtení položek podle indexu je možné jen u SortedList!
Console.WriteLine("První položka v seznamu je: {0}", jmena.Values(0))
Console.WriteLine("Poslední položka v seznamu je: {0}", jmena.Values(jmena.Count - 1))

Console.ReadKey()

V C# tady:

// vytvoření SortedList a SortedDictionary s klíčem typu INTEGER a hodnotou typu STRING 
SortedList<int, string> jmena = new SortedList<int, string>();
jmena.Add(3, "Jméno v SortedList 3");
jmena.Add(1, "Jméno v SortedList 1");
jmena.Add(2, "Jméno v SortedList 2");

SortedDictionary<int, string> jmena2 = new SortedDictionary<int, string>();
jmena2.Add(3, "Jméno v SortedDictionary 3");
jmena2.Add(1, "Jméno v SortedDictionary 1");
jmena2.Add(2, "Jméno v SortedDictionary 2");

// vypsat položky, které budou seřezené ze SortedList 
foreach (KeyValuePair<int, string> item in jmena)
{
    Console.WriteLine("{0} - {1}", item.Key, item.Value);
}

// vypsat položky, které budou seřezené ze SortedDictionary 
foreach (KeyValuePair<int, string> item in jmena2)
{
    Console.WriteLine("{0} - {1}", item.Key, item.Value);
}

// čtení položek podle indexu je možné jen u SortedList! 
Console.WriteLine("První položka v seznamu je: {0}", jmena.Values[0]);
Console.WriteLine("Poslední položka v seznamu je: {0}", jmena.Values[jmena.Count - 1]);

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