Önerilen cevapların performansa odaklandığını görebiliyorum. Aşağıda verilen makale performansla ilgili yeni bir şey sağlamaz, ancak temeldeki mekanizmaları açıklar. Ayrıca Collection
, soruda belirtilen üç Türe odaklanmadığını , ancak System.Collections.Generic
ad alanının tüm Türlerini ele aldığını unutmayın .
http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Özler:
Sözlük <>
Sözlük, muhtemelen en çok kullanılan ilişkisel kapsayıcı sınıfıdır. Sözlük, kapakların altında bir karma tablo kullandığı için ilişkili aramalar / eklemeler / silmeler için en hızlı sınıftır . Anahtarlar karma hale getirildiğinden, anahtar türü GetHashCode () ve Equals () 'ı doğru şekilde uygulamalı veya inşa sırasında sözlüğe harici bir IEqualityComparer sağlamalısınız. Sözlükteki öğelerin ekleme / silme / arama süresi amortize edilmiş sabit zamandır - O (1) - bu, sözlük ne kadar büyük olursa olsun, bir şeyi bulmak için geçen sürenin nispeten sabit kaldığı anlamına gelir. Bu, yüksek hızlı aramalar için oldukça arzu edilir. Tek dezavantajı , karma tablo kullanmanın doğası gereği sözlüğün sırasız olmasıdır.Sözlükteki öğeleri sırayla kolayca gezemezsiniz .
SortedDictionary <>
SortedDictionary, kullanım açısından Sözlüğe benzer, ancak uygulamada çok farklıdır. SortedDictionary anahtar tarafından sırayla öğeleri korumak için yorganın altında bir ikili ağacı kullanır . Sıralamanın bir sonucu olarak , anahtar için kullanılan tür , anahtarların doğru şekilde sıralanabilmesi için IComparable'ı doğru şekilde uygulamalıdır . Sıralanan sözlük, öğeleri sırayla muhafaza etme yeteneği için biraz arama süresiyle işlem yapar, bu nedenle sıralı bir sözlüğe ekleme / silme / arama süreleri logaritmik - O (log n) şeklindedir. Genel olarak konuşursak, logaritmik zamanla, koleksiyonun boyutunu ikiye katlayabilirsiniz ve öğeyi bulmak için yalnızca bir ekstra karşılaştırma yapması gerekir. Hızlı aramalar istediğinizde ancak aynı zamanda koleksiyonu anahtara göre sırayla koruyabilmek istediğinizde SortedDictionary kullanın.
SortedList <>
SortedList, genel kapsayıcılardaki diğer sıralanmış ilişkisel kapsayıcı sınıfıdır. SortedDictionary gibi SortedList, anahtar / değer çiftlerini sıralamak için bir anahtar kullanır . Ancak SortedDictionary'den farklı olarak, SortedList'teki öğeler sıralı öğe dizisi olarak saklanır.. Bu, ekleme ve silmelerin doğrusal olduğu anlamına gelir - O (n) - çünkü bir öğeyi silmek veya eklemek listedeki tüm öğeleri yukarı veya aşağı kaydırmayı içerebilir. Bununla birlikte, arama süresi O (log n) 'dir çünkü SortedList, listedeki herhangi bir öğeyi anahtarına göre bulmak için ikili bir arama kullanabilir. Öyleyse neden bunu yapmak isteyesiniz? Cevap şu ki, SortedList'i önceden yükleyecekseniz, eklemeler daha yavaş olacaktır, ancak dizi indeksleme aşağıdaki nesne bağlantılarından daha hızlı olduğu için aramalar marjinal olarak SortedDictionary'den daha hızlıdır. Bir kez daha bunu, hızlı aramalar istediğiniz ve koleksiyonu anahtara göre sırayla korumak istediğiniz ve ekleme ve silme işlemlerinin nadir olduğu durumlarda kullanacağım.
Temel Prosedürlerin Geçici Özeti
Her şeyi doğru anlamadığımdan emin olduğum için geri bildirim çok açıktır.
- Tüm diziler boyuttadır
n
.
- Sıralanmamış dizi = .Ekle /. Kaldır O (1), ancak. Öğe (i) O (n).
- Sıralanmış dizi = .Ekle /. Kaldır O (n), ancak .Item (i) O (log n).
Sözlük
Hafıza
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Ekle
HashArray(n) = Key.GetHash
# O (1) ekle
KeyArray(n) = PointerToKey
# O (1) ekle
ItemArray(n) = PointerToItem
# O (1) ekle
Kaldırmak
For i = 0 to n
, i
nerede HashArray(i) = Key.GetHash
# O (log n) (sıralanmış dizi) bulun
- Kaldır
HashArray(i)
# O (n) (sıralanmış dizi)
KeyArray(i)
# O (1) öğesini kaldır
ItemArray(i)
# O (1) öğesini kaldır
Ürünü Al
For i = 0 to n
, i
nerede HashArray(i) = Key.GetHash
# O (log n) (sıralanmış dizi) bulun
- Dönüş
ItemArray(i)
Döngü
For i = 0 to n
, dönüş ItemArray(i)
SortedDictionary
Hafıza
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Ekle
KeyArray(n) = PointerToKey
# O (1) ekle
ItemArray(n) = PointerToItem
# O (1) ekle
For i = 0 to n
, i
nerede KeyArray(i-1) < Key < KeyArray(i)
(kullanarak ICompare
) # O (n)
OrderArray(i) = n
# O (n) (sıralanmış dizi) ekle
Kaldırmak
For i = 0 to n
, i
nerede KeyArray(i).GetHash = Key.GetHash
# O (n) bulun
KeyArray(SortArray(i))
# O (n) öğesini kaldır
ItemArray(SortArray(i))
# O (n) öğesini kaldır
- Kaldır
OrderArray(i)
# O (n) (sıralanmış dizi)
Ürünü Al
For i = 0 to n
, i
nerede KeyArray(i).GetHash = Key.GetHash
# O (n) bulun
- Dönüş
ItemArray(i)
Döngü
For i = 0 to n
, dönüş ItemArray(OrderArray(i))
Sıralanmış Liste
Hafıza
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Ekle
For i = 0 to n
, i
nerede KeyArray(i-1) < Key < KeyArray(i)
(kullanarak ICompare
) # O (log n) bulun
KeyArray(i) = PointerToKey
# O (n) ekle
ItemArray(i) = PointerToItem
# O (n) ekle
Kaldırmak
For i = 0 to n
, i
nerede KeyArray(i).GetHash = Key.GetHash
# O (log n) bulun
KeyArray(i)
# O (n) öğesini kaldır
ItemArray(i)
# O (n) öğesini kaldır
Ürünü Al
For i = 0 to n
, i
nerede KeyArray(i).GetHash = Key.GetHash
# O (log n) bulun
- Dönüş
ItemArray(i)
Döngü
For i = 0 to n
, dönüş ItemArray(i)