Aracılığıyla paylaş


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 değiştirmek için , System.Collections.GenericSystem.Collections.Concurrent, ve System.Collections.Immutable ad alanındaki sınıfını veya sınıfları kullanabilirsiniz.

İki ana koleksiyon türü vardır; genel koleksiyonlar ve genel olmayan koleksiyonlar. Genel koleksiyonlar derleme zamanında tür açısından güvenlidir. Bu nedenle genel koleksiyonlar genellikle daha iyi performans sunar. Genel koleksiyonlar, oluşturulduğunda bir tür parametresi kabul ederler. Koleksiyona öğe eklerken veya koleksiyondan öğe kaldırırken Object türüne dönüştürmeniz veya türünden dönüştürmeniz gerekmez. Ayrıca, genel koleksiyonların çoğu Windows Mağazası uygulamalarında desteklenir. Genel olmayan koleksiyonlar, öğeleri Object olarak depolar, çevirme gerektirir ve çoğu Windows Store uygulama geliştirme için desteklenmez. Ancak, eski kodda genel olmayan koleksiyonlar görebilirsiniz.

.NET Framework 4 ve sonraki sürümlerde, System.Collections.Concurrent ad alanındaki koleksiyonlar, birden çok iş parçacığından koleksiyon öğelerine erişmek için verimli ve iş parçacığına güvenli işlemler sağlar. İşlemler özgün koleksiyonun System.Collections.Immutable bir kopyası üzerinde gerçekleştirildiğinden ve özgün koleksiyon değiştirilemediğinden ad alanındaki sabit koleksiyon sınıfları (NuGet paketi) 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, ICollection arabirimini veya ICollection<T> arabirimini doğrudan veya dolaylı olarak uygulayan tüm koleksiyonlar şu özellikleri paylaşır:

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

  • Kapasite ve Sayı özellikleri

    Bir koleksiyonun kapasitesi, içerebileceği öğe sayısıdır. Koleksiyonun sayısı, aslında içerdiği öğe sayısıdır. Bazı koleksiyonlar kapasiteyi, sayıyı veya her ikisini de gizler.

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

    A BitArray özel bir durumdur; kapasitesi, uzunluğu ve sayısı ile 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ın sıfır alt sınırı vardır 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.CreateInstance 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).

    System.Collections ad alanındaki genel olmayan koleksiyon türleri, iş parçacığı güvenliğine katkıda bulunacak şekilde eşitleme ile bazı thread güvenliği sağlar; bu güvenlik genellikle SyncRoot ve IsSynchronized üyeleri aracılığıyla kullanıma sunulur. Bu koleksiyonlar varsayılan olarak iş parçacığı açısından güvenli değildir. Bir koleksiyona ölçeklenebilir ve verimli bir şekilde çok iş parçacıklı erişime ihtiyacınız varsa, System.Collections.Concurrent ad alanındaki sınıflardan birini kullanın veya değişmez bir koleksiyon kullanmayı göz önünde bulundurun. Daha fazla bilgi için bkz. Thread-Safe Koleksiyonları.

Koleksiyon seçin

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 koleksiyonları yeni kullanıyorsanız, aşağıdaki tablo göreviniz için en uygun genel koleksiyonu seçmenize yardımcı olur:

İstiyorum... Genel koleksiyon seçenekleri Genel olmayan koleksiyon seçenekleri Eş zamanlı güvenli veya değişmez 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>
Son girenFirst-Out (LIFO) veriyi 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. (uygular INotifyPropertyChanged ve INotifyCollectionChanged) 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ı dengeleri 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 performanslıdır ancak değişmezlik sağlar- bu genellikle geçerli bir karşılaştırmalı avantajdır.

Değiştirilebilir Amorti edildi En Kötü Durum Değiştirilemez 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 logaritma n) ImmutableSortedDictionary<T>.Add O(günlük n)

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

Ayrıca, her ikisi de ikili ağaç kullandığı için SortedSet<T> ve ImmutableSortedSet<T> aynı karmaşıklıktadır. Önemli fark, sabit bir ikili ağaç kullanmasıdır ImmutableSortedSet<T> . Mutasyona izin veren bir ImmutableSortedSet<T> sınıf da sunduğundanSystem.Collections.Immutable.ImmutableSortedSet<T>.Builder, hem değişmezliğe 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 Sıkça kullanılan System.Array, System.Collections.Generic.List<T> ve System.Collections.Generic.Dictionary<TKey,TValue> gibi 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.
Thread-Safe Koleksiyonları System.Collections.Concurrent.BlockingCollection<T> ve System.Collections.Concurrent.ConcurrentBag<T> gibi koleksiyon türlerini açıklayarak, birden çok iş parçacığından güvenli ve verimli eşzamanlı erişimi destekler.
System.Collections.Immutable Sabit koleksiyonları tanıtır ve koleksiyon türlerine bağlantılar sağlar.

Kaynak