Wybieranie klasy kolekcji
Pamiętaj, aby starannie wybrać klasę kolekcji. Użycie nieprawidłowego typu może ograniczyć użycie kolekcji.
Ważne
Unikaj używania System.Collections typów w przestrzeni nazw. Zalecane są ogólne i współbieżne wersje kolekcji ze względu na ich większe bezpieczeństwo i inne ulepszenia.
Zastanów się nad następującymi pytaniami:
Czy potrzebujesz listy sekwencyjnej, w której element jest zwykle odrzucany po pobraniu jego wartości?
Jeśli tak, rozważ użycie Queue klasy lub Queue<T> klasy ogólnej, jeśli potrzebujesz zachowania first-in, first-out (FIFO). Rozważ użycie Stack klasy lub Stack<T> klasy ogólnej, jeśli potrzebujesz zachowania last-in, first-out (LIFO). Aby uzyskać bezpieczny dostęp z wielu wątków, użyj współbieżnych wersji ConcurrentQueue<T> i ConcurrentStack<T>. W przypadku niezmienności rozważ niezmienne wersje ImmutableQueue<T> i ImmutableStack<T>.
Jeśli nie, rozważ użycie innych kolekcji.
Czy musisz uzyskać dostęp do elementów w określonej kolejności, takich jak FIFO, LIFO lub losowe?
Klasa Queue , a także Queue<T>klasy , ConcurrentQueue<T>i ImmutableQueue<T> klasy ogólne oferują dostęp FIFO. Aby uzyskać więcej informacji, zobacz Kiedy używać kolekcji wątków Sejf.
Klasa Stack , a także Stack<T>klasy , ConcurrentStack<T>i ImmutableStack<T> klasy ogólne oferują dostęp LIFO. Aby uzyskać więcej informacji, zobacz Kiedy używać kolekcji wątków Sejf.
Klasa LinkedList<T> ogólna umożliwia sekwencyjny dostęp z głowy do ogona lub od ogona do głowy.
Czy musisz uzyskać dostęp do każdego elementu według indeksu?
ArrayList Klasy i StringCollection i i List<T> klasa ogólna oferują dostęp do swoich elementów przez indeks zerowy elementu. W przypadku niezmienności rozważ niezmienne wersje ImmutableArray<T> ogólne i ImmutableList<T>.
Klasy Hashtable, SortedList, ListDictionaryi StringDictionary i Dictionary<TKey,TValue>SortedDictionary<TKey,TValue> klasy ogólne oferują dostęp do ich elementów według klucza elementu. Ponadto istnieją niezmienne wersje kilku odpowiednich typów: ImmutableHashSet<T>, , ImmutableDictionary<TKey,TValue>ImmutableSortedSet<T>i ImmutableSortedDictionary<TKey,TValue>.
Klasy NameObjectCollectionBase i, a KeyedCollection<TKey,TItem> klasy ogólne NameValueCollection i SortedList<TKey,TValue> oferują dostęp do swoich elementów za pomocą indeksu opartego na zera lub klucza elementu.
Czy każdy element będzie zawierać jedną wartość, kombinację jednego klucza i jednej wartości, czy kombinację jednego klucza i wielu wartości?
Jedna wartość: użyj dowolnej kolekcji na podstawie interfejsu IList lub interfejsu IList<T> ogólnego. W przypadku opcji niezmiennej należy wziąć pod uwagę IImmutableList<T> interfejs ogólny.
Jeden klucz i jedna wartość: użyj dowolnej kolekcji na podstawie interfejsu IDictionary lub interfejsu IDictionary<TKey,TValue> ogólnego. W przypadku opcji niezmiennej należy wziąć pod uwagę IImmutableSet<T> interfejsy lub IImmutableDictionary<TKey,TValue> ogólne.
Jedna wartość z kluczem osadzonym: użyj KeyedCollection<TKey,TItem> klasy ogólnej.
Jeden klucz i wiele wartości: użyj NameValueCollection klasy .
Czy należy posortować elementy inaczej niż wprowadzone?
Klasa Hashtable sortuje elementy według ich kodów skrótów.
Klasa SortedList i SortedList<TKey,TValue>SortedDictionary<TKey,TValue> klasy ogólne sortują swoje elementy według klucza. Kolejność sortowania jest oparta na implementacji interfejsu IComparer dla SortedList klasy i implementacji interfejsu IComparer<T> ogólnego dla SortedList<TKey,TValue> klas i SortedDictionary<TKey,TValue> ogólnych. Spośród dwóch typów SortedDictionary<TKey,TValue> ogólnych zapewnia lepszą wydajność niż SortedList<TKey,TValue>, a jednocześnie SortedList<TKey,TValue> zużywa mniej pamięci.
ArrayList Udostępnia metodę Sort , która przyjmuje implementację IComparer jako parametr. Jego ogólny odpowiednik, List<T> klasa ogólna, udostępnia metodę Sort , która przyjmuje implementację interfejsu IComparer<T> ogólnego jako parametru.
Czy potrzebujesz szybkich wyszukiwań i pobierania informacji?
- ListDictionary jest szybszy niż Hashtable w przypadku małych kolekcji (10 elementów lub mniej). Klasa Dictionary<TKey,TValue> ogólna zapewnia szybsze wyszukiwanie niż SortedDictionary<TKey,TValue> klasa ogólna. Implementacja wielowątkowa to ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> Zapewnia szybkie wstawienie wielowątkowa dla danych nieurządzanych. Aby uzyskać więcej informacji na temat obu typów wielowątkowych, zobacz Kiedy używać kolekcji wątków Sejf.
Czy potrzebujesz kolekcji, które akceptują tylko ciągi?
StringCollection (na IListpodstawie ) i StringDictionary (na IDictionarypodstawie ) znajdują się w System.Collections.Specialized przestrzeni nazw.
Ponadto można użyć dowolnej z ogólnych klas kolekcji w System.Collections.Generic przestrzeni nazw jako silnie typizowane kolekcje ciągów, określając klasę String dla ich argumentów typu ogólnego. Można na przykład zadeklarować zmienną typu Ciąg> listy<lub Ciąg słownika<, Ciąg>.
LINQ to Objects i PLINQ
LINQ to Objects umożliwia deweloperom używanie zapytań LINQ do uzyskiwania dostępu do obiektów w pamięci, o ile typ obiektu implementuje IEnumerable lub IEnumerable<T>. Zapytania LINQ zapewniają wspólny wzorzec uzyskiwania dostępu do danych, zazwyczaj są bardziej zwięzłe i czytelne niż foreach
standardowe pętle oraz zapewniają możliwości filtrowania, porządkowania i grupowania. Aby uzyskać więcej informacji, zobacz LINQ to Objects (C#) i LINQ to Objects (Visual Basic).
PLINQ zapewnia równoległą implementację linQ to Objects, która może oferować szybsze wykonywanie zapytań w wielu scenariuszach dzięki bardziej wydajnemu użyciu komputerów wielordzeniowych. Aby uzyskać więcej informacji, zobacz Parallel LINQ (PLINQ).