Memilih Kelas Koleksi
Pastikan untuk memilih kelas koleksi Anda dengan hati-hati. Menggunakan jenis yang salah dapat membatasi penggunaan koleksi Anda.
Penting
Hindari mengunakan jenis di System.Collections namespace layanan. Versi generik dan bersamaan dari koleksi direkomendasikan karena keamanan jenisnya yang lebih besar dan peningkatan lainnya.
Pertimbangkan pertanyaan-pertanyaan berikut:
Apakah Anda memerlukan daftar berurutan di mana elemen biasanya dibuang setelah nilainya diambil?
Jika ya, pertimbangkan untuk menggunakan Queue kelas atau Queue<T> kelas generik jika Anda memerlukan perilaku first-in, first-out (FIFO). Pertimbangkan untuk menggunakan Stack kelas atau Stack<T> kelas generik jika Anda memerlukan perilaku first-in, first-out (FIFO). Untuk akses aman dari beberapa alur, gunakan versi bersamaan, ConcurrentQueue<T> dan ConcurrentStack<T>. Untuk imutabilitas, pertimbangkan versi yang tidak dapat diubah, ImmutableQueue<T> dan ImmutableStack<T>.
Jika tidak, pertimbangkan untuk menggunakan koleksi lain.
Apakah Anda perlu mengakses elemen dalam urutan tertentu, seperti FIFO, LIFO, atau acak?
Kelas Queue, serta kelas generik Queue<T>, ConcurrentQueue<T> dan ImmutableQueue<T> semuanya menawarkan akses FIFO. Untuk informasi selengkapnya, lihat Kapan Menggunakan Koleksi Thread-Safe.
Kelas Stack, serta kelas generik Stack<T>, ConcurrentStack<T> dan ImmutableStack<T> semuanya menawarkan akses FIFO. Untuk informasi selengkapnya, lihat Kapan Menggunakan Koleksi Thread-Safe.
Kelas LinkedList<T> generik memungkinkan akses berurutan baik dari kepala ke ekor, atau dari ekor ke kepala.
Apakah Anda perlu mengakses setiap elemen menurut indeks?
Kelas ArrayList dan StringCollection serta List<T> kelas generik menawarkan akses ke elemen mereka oleh indeks elemen berbasis nol. Untuk imutabilitas, pertimbangkan versi generik yang tidak dapat diubah, ImmutableArray<T> dan ImmutableList<T>.
Hashtable, SortedList, ListDictionary, dan StringDictionary kelas, dan Dictionary<TKey,TValue> serta SortedDictionary<TKey,TValue> kelas generik menawarkan akses ke elemen mereka oleh indeks elemen berbasis nol. Selain itu, ada versi yang tidak dapat diubah dari beberapa jenis yang sesuai: ImmutableHashSet<T>, ImmutableDictionary<TKey,TValue>, ImmutableSortedSet<T>, dan ImmutableSortedDictionary<TKey,TValue>.
Kelas NameObjectCollectionBase dan NameValueCollection, dan KeyedCollection<TKey,TItem> serta SortedList<TKey,TValue> kelas generik menawarkan akses ke elemen mereka oleh indeks elemen berbasis nol.
Apakah setiap elemen akan berisi satu nilai, kombinasi satu kunci dan satu nilai, atau kombinasi satu kunci dan beberapa nilai?
Satu nilai: Gunakan salah satu koleksi berdasarkan IList antarmuka atau IList<T> antarmuka generik. Untuk opsi yang tidak dapat diubah, pertimbangkan IImmutableList<T> antarmuka generik.
Satu kunci dan satu nilai: Gunakan salah satu koleksi berdasarkan IDictionary antarmuka atau IDictionary<TKey,TValue> antarmuka generik. Untuk opsi yang tidak dapat diubah, pertimbangkan IImmutableSet<T> atau IImmutableDictionary<TKey,TValue> antarmuka generik.
Satu nilai dengan kunci yang disematkan: Gunakan KeyedCollection<TKey,TItem> kelas generik.
Satu kunci dan beberapa nilai: Gunakan NameValueCollection kelas.
Apakah Anda perlu mengurutkan elemen secara berbeda dari bagaimana elemen dimasukkan?
Kelas Hashtable mengurutkan elemennya berdasarkan kode hash mereka.
SortedList Kelas dan SortedList<TKey,TValue> serta SortedDictionary<TKey,TValue> kelas generik mengurutkan elemennya berdasarkan kunci. Urutan pengurutan didasarkan pada implementasi IComparer antarmuka untuk SortedList kelas dan pada implementasi IComparer<T> antarmuka generik untuk SortedList<TKey,TValue> dan SortedDictionary<TKey,TValue> kelas generik. Dari dua jenis generik, SortedDictionary<TKey,TValue> menawarkan performa yang lebih baik daripada SortedList<TKey,TValue>, sementara SortedList<TKey,TValue> mengonsumsi lebih sedikit memori.
ArrayList menyediakan Sort metode yang mengambil IComparer implementasi sebagai parameter. Rekan generiknya, List<T> kelas generik, menyediakan Sort metode yang mengambil implementasi IComparer<T> antarmuka generik sebagai parameter.
Apakah Anda memerlukan pencarian cepat dan pengambilan informasi?
- ListDictionary lebih cepat daripada Hashtable untuk koleksi kecil (10 item atau lebih sedikit). Kelas Dictionary<TKey,TValue> generik menyediakan pencarian yang lebih cepat daripada SortedDictionary<TKey,TValue> kelas generik. Implementasi multi-alur adalah ConcurrentDictionary<TKey,TValue>. ConcurrentBag<T> menyediakan penyisipan multi-alur yang cepat untuk data yang tidak diurutkan. Untuk informasi selengkapnya tentang kedua jenis multi-alur, lihat Kapan Menggunakan Koleksi Thread-Safe.
Apakah Anda memerlukan koleksi yang hanya menerima string?
StringCollection (berdasarkan IList) dan StringDictionary (berdasarkan IDictionary) berada di System.Collections.Specialized namespace layanan.
Selain itu, Anda dapat menggunakan salah satu kelas koleksi generik di System.Collections.Generic namespace layanan sebagai koleksi string yang diketik dengan kuat dengan menentukan String kelas untuk argumen jenis generiknya. Misalnya, Anda dapat mendeklarasikan variabel menjadi jenis List<String> atau Dictionary<String,String>.
LINQ ke Objek dan PLINQ
LINQ ke Objek memungkinkan pengembang menggunakan kueri LINQ untuk mengakses objek dalam memori selama jenis objek mengimplementasikan IEnumerable atau IEnumerable<T>. Kueri LINQ menyediakan pola umum untuk mengakses data, biasanya lebih ringkas dan dapat dibaca daripada perulangan standar foreach
, dan menyediakan kemampuan pemfilteran, pemesanan, dan pengelompokan. Untuk informasi selengkapnya, lihat LINQ ke Objek (C#) dan LINQ ke Objek (Visual Basic).
PLINQ menyediakan implementasi paralel LINQ ke Objek yang dapat menawarkan eksekusi kueri yang lebih cepat dalam banyak skenario, melalui penggunaan komputer multi-inti yang lebih efisien. Untuk informasi selengkapnya, lihat LINQ Paralel (PLINQ).