Megosztás a következőn keresztül:


Gyűjtemények és adatstruktúrák

A hasonló adatok gyakran hatékonyabban kezelhetők, ha gyűjteményként tárolják és kezelik azokat. Az osztályt vagy a , System.Collections.Generic, , System.Collections.Concurrentés System.Collections.Immutable névterek osztályait System.Collectionshasználhatja System.Array a gyűjtemény egyes elemeinek vagy egy elemtartományának hozzáadására, eltávolítására és módosítására.

A gyűjteményeknek két fő típusa van; általános és nem általános gyűjtemények. Az általános gyűjtemények típusbiztosak a fordításkor. Emiatt az általános gyűjtemények általában jobb teljesítményt nyújtanak. Az általános gyűjtemények akkor fogadnak el típusparamétert, amikor létrejönnek, és nem követelik meg, hogy a gyűjtemény elemeinek hozzáadásakor vagy eltávolításakor a típusra és a típusra Object is átvehesse azokat. Emellett a legtöbb általános gyűjtemény támogatott az Windows Store-alkalmazásokban. A nem általános gyűjtemények az elemeket Objectexplicit módon tárolják, és a legtöbb nem támogatott Windows Store-alkalmazásfejlesztéshez. Előfordulhat azonban, hogy nem általános gyűjteményeket lát a régebbi kódban.

A .NET-keretrendszer 4-től kezdve a System.Collections.Concurrent névtérben lévő gyűjtemények hatékony szálbiztos műveleteket biztosítanak a gyűjteményelemek több szálból való eléréséhez. A névtérben (NuGet-csomagban) található System.Collections.Immutable nem módosítható gyűjteményosztályok eredendően szálbiztosak, mivel a műveletek az eredeti gyűjtemény egy példányán hajthatók végre, és az eredeti gyűjtemény nem módosítható.

Gyakori gyűjteményfunkciók

Minden gyűjtemény lehetőséget nyújt a gyűjtemény elemeinek hozzáadására, eltávolítására vagy megkeresésére. Emellett minden gyűjtemény, amely közvetlenül vagy közvetve implementálja az ICollection interfészt vagy az ICollection<T> interfészt, a következő funkciókkal rendelkezik:

Emellett számos gyűjteményosztály a következő funkciókat tartalmazza:

  • Kapacitás és darabszám tulajdonságai

    A gyűjtemény kapacitása a tartalmazható elemek száma. A gyűjtemények száma a ténylegesen tartalmazott elemek száma. Egyes gyűjtemények elrejtik a kapacitást, a darabszámot vagy mindkettőt.

    A gyűjtemények többsége az aktuális kapacitás elérésekor automatikusan bővül a kapacitásban. A rendszer újra kiosztja a memóriát, és az elemeket átmásolja a régi gyűjteményből az újba. Ez csökkenti a gyűjtemény használatához szükséges kódot; A gyűjtemény teljesítménye azonban negatív hatással lehet. Például , ha Count kisebb, List<T>mintCapacity, az elem hozzáadása O(1) művelet. Ha a kapacitást növelni kell az új elem elhelyezéséhez, egy elem hozzáadása O(n) művelet lesz, ahol n van Count. A több újraosztás által okozott gyenge teljesítmény elkerülésének legjobb módja, ha a kezdeti kapacitást a gyűjtemény becsült méretére állítja be.

    Az A BitArray különleges eset; kapacitása megegyezik a hosszával, ami megegyezik a darabszámával.

  • Konzisztens alsó határ

    A gyűjtemény alsó határa az első elem indexe. A névterekben lévő System.Collections összes indexelt gyűjtemény alsó határa nulla, ami azt jelenti, hogy 0 indexelt. Array alapértelmezés szerint a nulla alsó határa van, de a Tömbosztály egy példányának létrehozásakor a használatával Array.CreateInstancemás alsó határ határozható meg.

  • Szinkronizálás több szálból való hozzáféréshez (System.Collections csak osztályok).

    A névtér nem általános gyűjteménytípusai bizonyos szálbiztonságot biztosítanak a System.Collections szinkronizáláshoz, általában a SyncRoot tagokon IsSynchronized keresztül. Ezek a gyűjtemények alapértelmezés szerint nem szálbiztosak. Ha skálázható és hatékony többszálas hozzáférésre van szüksége egy gyűjteményhez, használja a System.Collections.Concurrent névtér egyik osztályát, vagy fontolja meg egy nem módosítható gyűjtemény használatát. További információ: Thread-Széf Collections.

Gyűjtemény kiválasztása

Általában általános gyűjteményeket kell használnia. Az alábbi táblázat néhány gyakori gyűjtési forgatókönyvet és az ezekhez a forgatókönyvekhez használható gyűjteményosztályokat ismerteti. Ha most ismerkedik az általános gyűjteményekkel, ez a táblázat segít kiválasztani azt az általános gyűjteményt, amely a legjobban működik a feladatához.

Akarok... Általános gyűjteménybeállítások Nem általános gyűjteménybeállítások Szálbiztos vagy nem módosítható gyűjteménybeállítások
Elemek tárolása kulcs/érték párként a kulcs szerinti gyors kereséshez Dictionary<TKey,TValue> Hashtable

(Kulcs/érték párok gyűjteménye, amelyek a kulcs kivonatkódja alapján vannak rendszerezve.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
Elemek elérése index alapján List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
Elsőként a kezdő elemek használata (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
Utolsó előtti adatok használata (LIFO) Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
Elemek egymás utáni elérése LinkedList<T> Nincs javaslat Nincs javaslat
Értesítéseket kaphat az elemek eltávolításáról vagy gyűjteményhez való hozzáadásáról. (implementálja INotifyPropertyChanged és INotifyCollectionChanged) ObservableCollection<T> Nincs javaslat Nincs javaslat
Rendezett gyűjtemény SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
Matematikai függvények készlete HashSet<T>

SortedSet<T>
Nincs javaslat ImmutableHashSet<T>

ImmutableSortedSet<T>

Gyűjtemények algoritmikus összetettsége

Gyűjteményosztály kiválasztásakor érdemes megfontolni a teljesítmény lehetséges kompromisszumoit. Az alábbi táblázatból megtudhatja, hogyan viszonyulnak a különböző módosítható gyűjteménytípusok az algoritmikus összetettségben a megfelelő nem módosítható megfelelőikhez. A nem módosítható gyűjteménytípusok gyakran kevésbé teljesítőképesek, de nem módosíthatók , ami gyakran érvényes összehasonlító előny.

Változtatható Amortizált Legrosszabb eset Megváltoztathatatlan Összetettség
Stack<T>.Push O(1) O(n) ImmutableStack<T>.Push O(1)
Queue<T>.Enqueue O(1) O(n) ImmutableQueue<T>.Enqueue O(1)
List<T>.Add O(1) O(n) ImmutableList<T>.Add O(log n)
List<T>.Item[Int32] O(1) O(1) ImmutableList<T>.Item[Int32] O(log n)
List<T>.Enumerator O(n) O(n) ImmutableList<T>.Enumerator O(n)
HashSet<T>.AddKeresési O(1) O(n) ImmutableHashSet<T>.Add O(log n)
SortedSet<T>.Add O(log n) O(n) ImmutableSortedSet<T>.Add O(log n)
Dictionary<T>.Add O(1) O(n) ImmutableDictionary<T>.Add O(log n)
Dictionary<T> Keresési O(1) O(1) – vagy szigorúan O(n) ImmutableDictionary<T> Keresési O(log n)
SortedDictionary<T>.Add O(log n) O(n log n) ImmutableSortedDictionary<T>.Add O(log n)

Az A-k List<T> hatékonyan számba vehetők hurkok for vagy hurkok foreach használatával. Az ImmutableList<T>indexelő O(logn) ideje miatt azonban egy hurokban for gyenge a feladat. A hurok használatával történő számbavétel ImmutableList<T> azért hatékony, mert ImmutableList<T> bináris fával tárolja az adatokat egy egyszerű tömb, például List<T> a felhasználások helyett.foreach A tömbök nagyon gyorsan indexelhetők, míg a bináris fát le kell járni, amíg meg nem találja a kívánt indexet tartalmazó csomópontot.

Emellett ugyanolyan összetettséggel rendelkezik, SortedSet<T> mint a ImmutableSortedSet<T>. Ez azért van, mert mindkettő bináris fákat használ. A jelentős különbség természetesen az, hogy ImmutableSortedSet<T> használ egy nem módosítható bináris fa. Mivel ImmutableSortedSet<T> egy olyan osztályt System.Collections.Immutable.ImmutableSortedSet<T>.Builder is kínál, amely lehetővé teszi a mutációt, a megváltoztathatatlanság és a teljesítmény is lehet.

Cím Leírás
Gyűjteményosztály kiválasztása Ismerteti a különböző gyűjteményeket, és segít kiválasztani egyet a forgatókönyvéhez.
Gyakran használt gyűjteménytípusok A gyakran használt általános és nemgenerikus gyűjteménytípusokat ismerteti, például System.Array: , System.Collections.Generic.List<T>és System.Collections.Generic.Dictionary<TKey,TValue>.
Mikor érdemes általános gyűjteményeket használni? Az általános gyűjteménytípusok használatát ismerteti.
Gyűjteményeken belüli összehasonlítások és rendezések Az egyenlőségi összehasonlítások és a rendezési összehasonlítások gyűjteményekben való használatát ismerteti.
Rendezett gyűjteménytípusok A rendezett gyűjtemények teljesítményét és jellemzőit ismerteti
Kivonatoló és szótárgyűjtemény-típusok Az általános és nem általános kivonatalapú szótártípusok funkcióit ismerteti.
Szál-Széf gyűjtemények Olyan gyűjteménytípusokat ismertet, mint például System.Collections.Concurrent.BlockingCollection<T>System.Collections.Concurrent.ConcurrentBag<T> a több szálból való biztonságos és hatékony egyidejű hozzáférést támogató gyűjteménytípusok.
System.Collections.Nem módosítható Bemutatja a nem módosítható gyűjteményeket, és hivatkozásokat biztosít a gyűjteménytípusokra.

Hivatkozás

System.Array System.Collections System.Collections.Concurrent System.Collections.Generic System.Collections.Specialized System.Linq System.Collections.Immutable