Sdílet prostřednictvím


Definování kolekcí

Kolekce je množina podobně zadaných objektů, které jsou seskupeny.

Pro využití výhod konstrukcí, které jsou v jazyce obsaženy, mohou být objekty jakéhokoliv typu seskupeny do jedné kolekce typu Object. Například příkaz foreach jazyka C# (for each v jazyce Visual Basic) předpokládá, že všechny objekty v kolekci jsou jednoho typu.

V kolekci typu Object je však provedeno další zpracování jednotlivých prvků, jako je například převod zabalením nebo převod rozbalením, které ovlivňují výkon kolekce. K zabalení a rozbalení obvykle dochází, pokud uchováváme či získáváme hodnotové typy z kolekce typu Object.

Obecné kolekce, jako je například List<T> a typově silné neobecné kolekce, jako je StringCollection, se těchto výkonnostních výkyvů vyvarovávají, pokud typ elementu je typ, pro který je kolekce určena (například ukládání nebo získávání řetězců z StringCollection). Kromě toho typově silné kolekce automaticky ověřují typ každého prvku přidaného do kolekce. Z těchto důvodů se důrazně doporučuje používat třídy obecných kolekcí, kdykoli je to možné.

Všechny kolekce, které přímo nebo nepřímo implementují rozhraní ICollection nebo obecné rozhraní ICollection<T>, sdílejí kromě metod pro přidání, odebrání nebo vyhledávání prvku dalších několik funkcí:

  • Enumerátor.

    Enumerátor je objekt, který prochází jemu přidruženou kolekcí. To si lze představit jako pohyblivý ukazatel na libovolný prvek v kolekci. Enumerátor lze přiřadit pouze k jedné kolekci, ale kolekce může mít více enumerátorů. Příkaz foreach jazyka C# (for each v jazyce Visual Basic) používá enumerátor a skryje složitosti manipulace s enumerátorem.

  • Členy synchronizace (pouze třídy System.Collections).

    U starších typů kolekcí z oborů názvů System.Collections poskytuje synchronizace, při přístupu k prvků kolekce, určitý stupeň bezpečnosti přístupu z více vláken. Kolekce nejsou bezpečné pro přístup z více vláken ve výchozím nastavení. Pokud požadujete škálovatelný a efektivní vícevláknový přístup ke kolekci, použijte jednu ze tříd v oboru názvů System.Collections.Concurrent. Další informace naleznete v tématu Kolekce pro bezpečný přístup z více vláken.

    Pouze několik tříd v oboru názvů System.Collections poskytuje metodu Synchronize, která okolo kolekce vytvoří obal pro bezpečný přístup z více vláken. Všechny třídy ve všech oborech názvů System.Collections však poskytují vlastnost SyncRoot, kterou mohou použít odvozené třídy pro vytvoření vlastního obalu pro bezpečný přístup z více vláken. Vlastnost IsSynchronized je k dispozici také pro určení, zda je kolekce bezpečná pro přístup z více vláken. Synchronizace není k dispozici v obecném rozhraní ICollection<T>.

  • Metoda CopyTo**.**

    Všechny kolekce lze zkopírovat na pole pomocí metody CopyTo. Pořadí prvků v novém poli je založeno na pořadí, ve kterém je vrátí enumerátor. Výsledné pole je vždy jednorozměrné s dolní mezí rovnou nula.

Všimněte si, že obecné rozhraní ICollection<T> má další členy, které nejsou zahrnuty v neobecném rozhraní.

Následující funkce jsou implementovány v některých třídách z oboru názvů System.Collections:

  • kapacita a počet prvků.

    Kapacita kolekce je počet prvků, které může obsahovat. Počet prvků kolekce je počet prvků, které aktuálně obsahuje. BitArray je zvláštní případ. Kapacita této kolekce je stejná jako její délka, která je stejná jako počet prvků dané kolekce. Některé kolekce skrývají svou kapacitu nebo počet prvků nebo obojí.

    Všechny kolekce, při dosažení aktuální kapacity, danou kapacitu automaticky rozšíří. Je znovu přidělena paměť a prvky jsou zkopírovány z původní kolekce do nové. To snižuje množství kódu požadováno pro použití kolekce. Výkon kolekce však může být i nadále negativně ovlivněn. Nejlepší způsob, jak zabránit sníženému výkonu, který je zapříčiněn opakovaným přidělováním paměti, je nastavit počáteční kapacitu na hodnotu odhadované velikosti kolekce.

  • Dolní mez.

    Dolní mez kolekce je index jejího prvního prvku. Všechny indexované kolekce v oboru názvů System.Collections mají jako dolní mez nulu. Array má dolní mez ve výchozím nastavení nastavenu na nulu, ale při vytváření třídy Array pomocí CreateInstance může být definována jiná hodnota dolní meze.

Třídy v System.Collections mohou být obecně rozděleny na tři typy:

  • Běžně používané kolekce.

    Tyto typy kolekcí jsou běžné varianty kolekcí dat, jako například tabulky hash hodnot, fronty, zásobníky, slovníky a seznamy. Mnoho běžně používaných kolekcí má neobecnou verzi, obecnou verzi a obecnou verzi s bezpečným přístupem z více vlákno.

  • Kolekce bitů.

    To jsou kolekce, jejichž prvky jsou bitové příznaky. Na rozdíl od jiných kolekcí se chovají mírně odlišně.

  • Specializované kolekce.

    Toto jsou kolekce pro velmi specifické účely, obvykle ke zpracování určitého typu prvku, jako například StringDictionary.

Je třeba pečlivě zvolit třídy kolekce. Vzhledem k tomu, že každá kolekce má své vlastní funkce, má také vlastní omezení. Čím je kolekce specializovanější, tím je omezenější. Tipy ohledně výběru kolekce naleznete v tématu Výběr třídy kolekce.

Viz také

Odkaz

System.Collections

System.Collections.Specialized

System.Collections.Generic

System.Collections.Concurrent

Koncepty

Kolekce a datové struktury

Výběr třídy kolekce