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:
A gyűjtemény enumerálásának képessége
A .NET-gyűjtemények implementálhatják System.Collections.IEnumerable vagy System.Collections.Generic.IEnumerable<T> engedélyezhetik a gyűjtemény iterálását. Az enumerátorok a gyűjtemény bármely elemére mutató mozgatható mutatóként tekinthetők. A foreach, in statement és a For Each... A Next Utasítás a metódus által GetEnumerator közzétett enumerátort használja, és elrejti az enumerátor kezelésének összetettségét. Emellett minden implementált System.Collections.Generic.IEnumerable<T> gyűjtemény lekérdezhető típusnak minősül, és lekérdezhető a LINQ használatával. A LINQ-lekérdezések gyakran használják az adatok elérését. Ezek általában tömörebbek és olvashatóbbak, mint a normál
foreach
hurkok, és szűrési, rendezési és csoportosítási képességeket biztosítanak. A LINQ-lekérdezések a teljesítményt is javíthatják. További információ: LINQ to Objects (C#), LINQ to Objects (Visual Basic), párhuzamos LINQ (PLINQ), bevezetés a LINQ-lekérdezések használatába (C#) és egyszerű lekérdezési műveletek (Visual Basic).A gyűjtemény tartalmának másolása tömbbe
Minden gyűjtemény másolható egy tömbbe a CopyTo metódussal; Az új tömb elemeinek sorrendje azonban azon a sorrenden alapul, amelyben az enumerátor visszaadja őket. Az eredményül kapott tömb mindig egydimenziós, alsó határa nulla.
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, aholn
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>.Add Keresé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.
Kapcsolódó témakörök
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