Koleksiyonlar ve Veri Yapıları

Benzer veriler genellikle koleksiyon olarak depolandığında ve işlendiğinde daha verimli bir şekilde işlenebilir. Bir koleksiyondaki System.ArraySystem.Collectionstek tek öğeleri veya bir dizi öğeyi eklemek, kaldırmak ve System.Collections.Immutable değiştirmek için , System.Collections.Generic, System.Collections.Concurrentve ad alanındaki sınıfı veya sınıfları kullanabilirsiniz.

İki ana koleksiyon türü vardır; genel koleksiyonlar ve genel olmayan koleksiyonlar. Derleme zamanında genel koleksiyonlar tür açısından güvenlidir. Bu nedenle genel koleksiyonlar genellikle daha iyi performans sunar. Genel koleksiyonlar, oluşturulurken bir tür parametresi kabul ederler ve koleksiyona öğe eklerken veya koleksiyondan Object öğe kaldırırken türe ve türe dönüştürmenizi gerektirmez. Ayrıca, çoğu genel koleksiyon Windows Store uygulamalarında desteklenir. Genel olmayan koleksiyonlar öğeleri olarak Objectdepolar, atama gerektirir ve çoğu Windows Store uygulaması geliştirme için desteklenmez. Ancak, eski kodda genel olmayan koleksiyonlar görebilirsiniz.

.NET Framework 4'ten başlayarak, ad alanı içindeki System.Collections.Concurrent koleksiyonlar birden çok iş parçacığından koleksiyon öğelerine erişmek için verimli iş parçacığı güvenli işlemler sağlar. ad alanındaki System.Collections.Immutable sabit koleksiyon sınıfları (NuGet paketi), işlemler özgün koleksiyonun bir kopyası üzerinde gerçekleştirildiğinden ve özgün koleksiyon değiştirilemediğinden doğal olarak iş parçacığı açısından güvenlidir.

Ortak koleksiyon özellikleri

Tüm koleksiyonlar koleksiyondaki öğeleri eklemek, kaldırmak veya bulmak için yöntemler sağlar. Ayrıca, arabirimi veya arabirimi doğrudan veya dolaylı olarak uygulayan ICollection tüm koleksiyonlar ICollection<T> şu özellikleri paylaşır:

Ayrıca, birçok koleksiyon sınıfı aşağıdaki özellikleri içerir:

  • Kapasite ve Sayı özellikleri

    Koleksiyonun kapasitesi, içerebileceği öğe sayısıdır. Koleksiyonun sayısı, gerçekte içerdiği öğelerin sayısıdır. Bazı koleksiyonlar kapasiteyi, sayıyı veya her ikisini gizler.

    Geçerli kapasiteye ulaşıldığında çoğu koleksiyon otomatik olarak kapasitede genişler. Bellek yeniden ayrılır ve öğeler eski koleksiyondan yenisine kopyalanır. Bu, koleksiyonu kullanmak için gereken kodu azaltır; ancak koleksiyonun performansı olumsuz etkilenebilir. Örneğin, değerinden List<T>Capacityküçükse Count için öğe eklemek bir O(1) işlemidir. Yeni öğeye uyum sağlamak için kapasitenin artırılması gerekiyorsa, bir öğe eklemek bir O(n) işlemine dönüşür ve burada n olur Count. Birden çok yeniden yüklemenin neden olduğu düşük performansı önlemenin en iyi yolu, ilk kapasiteyi koleksiyonun tahmini boyutu olacak şekilde ayarlamaktır.

    A BitArray özel bir durumdur; kapasitesi, sayısıyla aynı olan uzunluğuyla aynıdır.

  • Tutarlı bir alt sınır

    Bir koleksiyonun alt sınırı, ilk öğesinin dizinidir. Ad alanları içindeki System.Collections tüm dizinlenmiş koleksiyonlar sıfır alt sınırına sahiptir ve bu da 0 dizinli oldukları anlamına gelir. Arrayvarsayılan olarak sıfır alt sınırına sahiptir, ancak kullanılarak Array.CreateInstanceArray sınıfının bir örneği oluşturulurken farklı bir alt sınır tanımlanabilir.

  • Birden çok iş parçacığından erişim için eşitleme (System.Collections yalnızca sınıflar).

    Ad alanında System.Collections genel olmayan koleksiyon türleri eşitleme ile bazı iş parçacığı güvenliği sağlar; genellikle ve IsSynchronized üyeleri aracılığıyla SyncRoot kullanıma sunulur. Bu koleksiyonlar varsayılan olarak iş parçacığı açısından güvenli değildir. Bir koleksiyona ölçeklenebilir ve verimli çok iş parçacıklı erişim gerekiyorsa, ad alanında System.Collections.Concurrent sınıflardan birini kullanın veya sabit bir koleksiyon kullanmayı göz önünde bulundurun. Daha fazla bilgi için bkz. thread-Kasa Koleksiyonları.

Koleksiyon seçme

Genel olarak, genel koleksiyonlar kullanmanız gerekir. Aşağıdaki tabloda bazı yaygın koleksiyon senaryoları ve bu senaryolar için kullanabileceğiniz koleksiyon sınıfları açıklanmaktadır. Genel koleksiyonlarda yeniyseniz, bu tablo göreviniz için en uygun genel koleksiyonu seçmenize yardımcı olur.

İstiyorum... Genel koleksiyon seçenekleri Genel olmayan koleksiyon seçenekleri İş parçacığı güvenli veya sabit koleksiyon seçenekleri
Anahtara göre hızlı arama için öğeleri anahtar/değer çiftleri olarak depolama Dictionary<TKey,TValue> Hashtable

(Anahtarın karma koduna göre düzenlenmiş anahtar/değer çiftleri koleksiyonu.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
Dizine göre öğelere erişme List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
İlk çıkan öğeleri kullanma (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
Verileri Son Çıkan İlk Çıkar (LIFO) kullanma Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
Öğelere sırayla erişme LinkedList<T> Öneri yok Öneri yok
Öğeler kaldırıldığında veya koleksiyona eklendiğinde bildirim alın. (ve uygular INotifyPropertyChangedINotifyCollectionChanged) ObservableCollection<T> Öneri yok Öneri yok
Sıralanmış koleksiyon SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
Matematiksel işlevler için bir küme HashSet<T>

SortedSet<T>
Öneri yok ImmutableHashSet<T>

ImmutableSortedSet<T>

Koleksiyonların algoritmik karmaşıklığı

Bir koleksiyon sınıfı seçerken, performansta olası dezavantajları göz önünde bulundurmaya değer. Çeşitli değiştirilebilir koleksiyon türlerinin algoritmik karmaşıklıkta karşılık gelen sabit karşılıklarıyla karşılaştırmasına başvurmak için aşağıdaki tabloyu kullanın. Sabit koleksiyon türleri genellikle daha az performans gösterir ancak değişmezlik sağlar. Bu genellikle geçerli bir karşılaştırmalı avantajdır.

Değiştirilebilir İtfa edilen En Kötü Durum Sabit Karmaşıklık
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(günlük n)
List<T>.Item[Int32] O(1) O(1) ImmutableList<T>.Item[Int32] O(günlük n)
List<T>.Enumerator O(n) O(n) ImmutableList<T>.Enumerator O(n)
HashSet<T>.AddArama O(1) O(n) ImmutableHashSet<T>.Add O(günlük n)
SortedSet<T>.Add O(günlük n) O(n) ImmutableSortedSet<T>.Add O(günlük n)
Dictionary<T>.Add O(1) O(n) ImmutableDictionary<T>.Add O(günlük n)
Dictionary<T> Arama O(1) O(1) – veya kesinlikle O(n) ImmutableDictionary<T> Arama O(günlük n)
SortedDictionary<T>.Add O(günlük n) O(n günlük n) ImmutableSortedDictionary<T>.Add O(günlük n)

bir List<T> döngü veya döngü kullanılarak verimli bir forforeach şekilde numaralandırılabilir. Ancak, ImmutableList<T>dizin oluşturucusunun O(log n) süresi nedeniyle bir döngü içinde for kötü bir iş yapar. Bir döngü kullanarak foreach listelemek ImmutableList<T> verimlidir çünkü ImmutableList<T> kullanır gibi List<T> basit bir dizi yerine verilerini depolamak için bir ikili ağaç kullanır. Bir dizi çok hızlı bir şekilde dizinine eklenebilirken, istenen dizine sahip düğüm bulunana kadar bir ikili ağaç aşağı doğru ilerletilmelidir.

Ayrıca, SortedSet<T> ile aynı karmaşıklık düzeyine ImmutableSortedSet<T>sahiptir. Çünkü her ikisi de ikili ağaç kullanıyor. Elbette önemli fark, sabit bir ikili ağaç kullanmasıdır ImmutableSortedSet<T> . ImmutableSortedSet<T> Ayrıca mutasyona izin veren bir System.Collections.Immutable.ImmutableSortedSet<T>.Builder sınıf sunduğundan, hem değişmezlik hem de performansa sahip olabilirsiniz.

Başlık Açıklama
Koleksiyon Sınıfı Seçme Farklı koleksiyonları açıklar ve senaryonuz için bir koleksiyon seçmenize yardımcı olur.
Yaygın Olarak Kullanılan Koleksiyon Türleri , System.Collections.Generic.List<T>ve System.Collections.Generic.Dictionary<TKey,TValue>gibi System.Arrayyaygın olarak kullanılan genel ve genel olmayan koleksiyon türlerini açıklar.
Genel Koleksiyonlar Ne Zaman Kullanılır? Genel koleksiyon türlerinin kullanımını açıklar.
Koleksiyonlar İçinde Karşılaştırmalar ve Sıralamalar Koleksiyonlarda eşitlik karşılaştırmalarının ve sıralama karşılaştırmalarının kullanımını açıklar.
Sıralanmış Koleksiyon Türleri Sıralanmış koleksiyonların performansını ve özelliklerini açıklar
Hashtable ve Sözlük Koleksiyon Türleri Genel ve genel olmayan karma tabanlı sözlük türlerinin özelliklerini açıklar.
İş Parçacığı Kasa Koleksiyonları birden çok iş parçacığından güvenli ve verimli eşzamanlı erişimi destekleyen ve System.Collections.Concurrent.ConcurrentBag<T> gibi System.Collections.Concurrent.BlockingCollection<T> koleksiyon türlerini açıklar.
System.Collections.Immutable Sabit koleksiyonları tanıtır ve koleksiyon türlerine bağlantılar sağlar.

Başvuru

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