Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
Koleksiyonu numaralandırabilme özelliği
.NET koleksiyonları, System.Collections.IEnumerable koleksiyonun yinelenecek şekilde uygulanmasını veya System.Collections.Generic.IEnumerable<T> etkinleştirilmesini sağlar. Bir numaralandırıcı, koleksiyondaki herhangi bir öğeye taşınabilir bir işaretçi olarak düşünülebilir. foreach, in ifadesi ve For Each... Next İfadesi, GetEnumerator yöntemi tarafından sunulan numaralandırıcıyı kullanır ve bu numaralandırıcıyı yönetmenin karmaşıklığını gizler. Ayrıca, uygulayan tüm koleksiyonlar System.Collections.Generic.IEnumerable<T>sorgulanabilir bir tür olarak kabul edilir ve LINQ ile sorgulanabilir. LINQ sorguları, verilere erişmek için ortak bir desen sağlar. Bunlar genellikle standart
foreach
döngülerden daha kısa ve okunabilirdir ve filtreleme, sıralama ve gruplandırma özellikleri sağlar. LINQ sorguları performansı da iyileştirebilir. Daha fazla bilgi için bkz. LINQ to Objects (C#), LINQ to Objects (Visual Basic), Parallel LINQ (PLINQ), LINQ Sorgularına Giriş (C#)ve Temel Sorgu İşlemleri (Visual Basic).Koleksiyon içeriğini bir diziye kopyalama özelliği
Tüm koleksiyonlar
CopyTo
yöntemi kullanılarak bir diziye kopyalanabilir. Ancak, yeni dizideki öğelerin sırası, numaralandırıcının bunları döndürdüğü sırayı temel alır. Sonuçta elde edilen dizi her zaman sıfırın alt sınırına sahip tek boyutludur.
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; buradan
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>.Add arama |
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.
İlgili makaleler
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. |