Porovnanie List, Dictionary a Collection v .NET
Pri vývoji v .NET narazíme veľmi rýchlo na kolekcie. Medzi najpoužívanejšie patria List<T>, Dictionary<TKey, TValue> a Collection<T>. Na prvý pohľad robia všetky to isté – držia v sebe objekty – no ich použitie a správanie je odlišné.
List<T>
List<T> je najčastejšie používaná kolekcia v .NET. Ide o dynamické pole, ktoré si zväčšuje kapacitu podľa potreby.
- Ukladá prvky v poradí, v akom ich pridávame.
- Prístup k prvku podľa indexu je veľmi rýchly (O(1)).
- Vyhľadávanie prvku podľa hodnoty je lineárne (O(n)).
- Používa sa, keď nám stačí „zoznam vecí“ bez potreby kľúčov.
// príklad použitia List<T>
var numbers = new List<int>();
numbers.Add(10);
numbers.Add(20);
int first = numbers[0]; // 10
bool contains20 = numbers.Contains(20);
Dictionary<TKey, TValue>
Dictionary<TKey, TValue> je kolekcia párov kľúč – hodnota. Hodnotu nevyhľadávame podľa pozície, ale podľa kľúča.
- Prístup k hodnote podľa kľúča je veľmi rýchly (typicky O(1)).
- Kľúče musia byť v rámci dictionary jedinečné.
- Pri zmene hodnoty cez kľúč nepreiterujeme celú kolekciu.
- Výborné, keď potrebujeme niečo ako „index“ – napr. vyhľadávanie podľa ID alebo kódu.
// príklad použitia Dictionary<TKey, TValue>
var prices = new Dictionary<string, decimal>();
prices["EUR"] = 1.0m;
prices["USD"] = 1.12m;
decimal eurPrice = prices["EUR"]; // 1.0
bool hasCzk = prices.ContainsKey("CZK");
Kedy použiť Dictionary?
Vždy, keď máš prirodzený kľúč (napr. kód meny, ID používateľa, číslo faktúry)
a často podľa neho vyhľadávaš.
Collection<T>
Collection<T> je menej používaná, ale veľmi užitočná trieda z
System.Collections.ObjectModel. Je to obal nad inou kolekciou (zvyčajne List<T>),
ktorý umožňuje lepšiu kontrolu nad tým, čo sa deje pri pridávaní a odstraňovaní prvkov.
- Často sa používa, keď chceme poskytnúť „bezpečnejšie API“ nad interným zoznamom.
- Umožňuje preťažiť metódy ako
InsertItem,RemoveItem,SetItem. - Vhodné pre doménové modely, kde chceme validovať každý zásah do kolekcie.
public class InvoiceItemCollection : Collection<InvoiceItem>
{
protected override void InsertItem(int index, InvoiceItem item)
{
if (item.Quantity <= 0)
{
throw new ArgumentException("Množstvo musí byť väčšie ako 0.");
}
base.InsertItem(index, item);
}
}
// použitie
var items = new InvoiceItemCollection();
items.Add(new InvoiceItem { Quantity = 1, Description = "Služba" });
Collection<T> je ideálna vtedy, keď nechceme vystaviť priamo List<T>, ale potrebujeme mať možnosť reagovať na zmenu obsahu kolekcie.
Porovnanie – čo kedy použiť?
| Kolekcia | Typický scenár | Výhody | Nevýhody |
|---|---|---|---|
| List<T> | Jednoduchý zoznam položiek, poradie, iterácia. | Rýchly index, jednoduché API, najpoužívanejší typ. | Pomalé vyhľadávanie podľa hodnoty pri veľkom počte prvkov. |
| Dictionary<TKey, TValue> | Vyhľadávanie podľa kľúča (ID, kód, názov). | Veľmi rýchle vyhľadávanie, jedinečné kľúče. | Vyšia pamäťová režia, zložitejší typ, poradie nie je garantované. |
| Collection<T> | Doménové kolekcie s vlastnou logikou (validácia, notifikácia). | Možnosť preťažiť správanie pri zmene kolekcie. | Menej známy typ, často len obal nad List<T>. |
Praktické odporúčania
- Začni vždy s List<T>, ak nepotrebuješ kľúč ani špeciálne správanie.
- Použi Dictionary<TKey, TValue>, ak často vyhľadávaš podľa jedinečného kľúča.
- Collection<T> použi v doménovom modeli, keď chceš kontrolovať, čo sa deje pri pridávaní/mazaní položiek.
Dobrá voľba kolekcie vie výrazne zjednodušiť kód, pridať mu čitateľnosť a zároveň zlepšiť výkon aplikácie. Ak staváš doménový model pre reálnu aplikáciu, oplatí sa nad týmto krokom chvíľu premýšľať.