När du ska använda allmänna samlingar
Med hjälp av generiska samlingar får du den automatiska fördelen med typsäkerhet utan att behöva härleda från en bassamlingstyp och implementera typspecifika medlemmar. Generiska samlingstyper fungerar också i allmänhet bättre än motsvarande icke-generiska samlingstyper (och bättre än typer som härleds från icke-generiska bassamlingstyper) när samlingselementen är värdetyper, eftersom det inte finns något behov av att boxa elementen med generiska objekt.
För program som riktar in sig på .NET Standard 1.0 eller senare använder du de allmänna samlingsklasserna i System.Collections.Concurrent namnområdet när flera trådar kan lägga till eller ta bort objekt från samlingen samtidigt. När du vill ha oföränderlighet bör du dessutom överväga de generiska samlingsklasserna i System.Collections.Immutable namnområdet.
Följande allmänna typer motsvarar befintliga samlingstyper:
Dictionary<TKey,TValue> och ConcurrentDictionary<TKey,TValue> är de generiska klasser som motsvarar Hashtable.
Collection<T> är den generiska klass som motsvarar CollectionBase. Collection<T> kan användas som basklass, men till skillnad från CollectionBaseär det inte abstrakt, vilket gör det mycket enklare att använda.
ReadOnlyCollection<T> är den generiska klass som motsvarar ReadOnlyCollectionBase. ReadOnlyCollection<T> är inte abstrakt och har en konstruktor som gör det enkelt att exponera en befintlig List<T> som en skrivskyddad samling.
Klasserna Queue<T>, ConcurrentQueue<T>, ImmutableQueue<T>, ImmutableArray<T>, SortedList<TKey,TValue>och ImmutableSortedSet<T> generiska motsvarar respektive icke-generiska klasser med samma namn.
Ytterligare typer
Flera generiska samlingstyper har inte icke-generiska motsvarigheter. Dessa inkluderar:
LinkedList<T> är en länkad lista för generell användning som tillhandahåller O(1) infognings- och borttagningsåtgärder.
SortedDictionary<TKey,TValue> är en sorterad ordlista med O(log
n
) infognings- och hämtningsåtgärder, vilket gör det till ett användbart alternativ till SortedList<TKey,TValue>.KeyedCollection<TKey,TItem> är en hybrid mellan en lista och en ordlista, vilket ger ett sätt att lagra objekt som innehåller sina egna nycklar.
BlockingCollection<T> implementerar en samlingsklass med avgränsnings- och blockeringsfunktioner.
ConcurrentBag<T> ger snabb infogning och borttagning av osorterade element.
Oföränderliga byggare
När du vill ha oföränderlighetsfunktioner i din app System.Collections.Immutable erbjuder namnområdet allmänna samlingstyper som du kan använda. Alla oföränderliga samlingstyper erbjuder Builder
klasser som kan optimera prestanda när du utför flera mutationer. Klassen Builder
batchar åtgärder i ett föränderligt tillstånd. När alla mutationer har slutförts anropar ToImmutable
du metoden för att "frysa" alla noder och skapar en oföränderlig generisk samling, till exempel en ImmutableList<T>.
Objektet Builder
kan skapas genom att anropa den icke-generiska CreateBuilder()
metoden. Från en Builder
instans kan du anropa ToImmutable()
. På samma sätt kan du anropa ToBuilder()
från Immutable*
samlingen för att skapa en builder-instans från den generiska oföränderliga samlingen. Följande är de olika Builder
typerna.
- ImmutableArray<T>.Builder
- ImmutableDictionary<TKey,TValue>.Builder
- ImmutableHashSet<T>.Builder
- ImmutableList<T>.Builder
- ImmutableSortedDictionary<TKey,TValue>.Builder
- ImmutableSortedSet<T>.Builder
LINQ till objekt
Med funktionen LINQ till objekt kan du använda LINQ-frågor för att komma åt minnesinterna objekt så länge objekttypen implementerar System.Collections.IEnumerable gränssnittet eller System.Collections.Generic.IEnumerable<T> . LINQ-frågor ger ett vanligt mönster för åtkomst till data. är vanligtvis mer koncisa och läsbara än standardloopar foreach
och tillhandahåller funktioner för filtrering, ordning och gruppering. LINQ-frågor kan också förbättra prestanda. Mer information finns i LINQ to Objects (C#), LINQ to Objects (Visual Basic), and Parallel LINQ (PLINQ).
Ytterligare funktioner
Vissa av de generiska typerna har funktioner som inte finns i de icke-generiska samlingstyperna. Klassen, som motsvarar den icke-generiska ArrayList klassen, har till exempel List<T> ett antal metoder som accepterar allmänna ombud, till exempel ombudet Predicate<T> som gör att du kan ange metoder för att söka i listan, ombudet Action<T> som representerar metoder som agerar på varje element i listan och ombudet Converter<TInput,TOutput> som låter dig definiera konverteringar mellan typer.
Med List<T> klassen kan du ange egna IComparer<T> allmänna gränssnittsimplementeringar för sortering och sökning i listan. Klasserna SortedDictionary<TKey,TValue> och SortedList<TKey,TValue> har också den här funktionen. Med de här klasserna kan du dessutom ange jämförelseobjekt när samlingen skapas. På liknande sätt kan klasserna Dictionary<TKey,TValue> och KeyedCollection<TKey,TItem> ange dina egna likhetsjämförlikare.