HashSet C # HashSet veri yapısı .NET Framework 3.5'te kullanılmaya başlandı. Uygulanan üyelerin tam bir listesini HashSet MSDN sayfasında bulabilirsiniz.
- Nerede kullanılır?
- Neden kullanmak istersiniz?
HashSet C # HashSet veri yapısı .NET Framework 3.5'te kullanılmaya başlandı. Uygulanan üyelerin tam bir listesini HashSet MSDN sayfasında bulabilirsiniz.
Yanıtlar:
A HashSet
, bir nesne kümesini tutar, ancak bir nesnenin zaten kümede olup olmadığını kolayca ve hızlı bir şekilde belirlemenizi sağlar. Bunu bir diziyi dahili olarak yöneterek ve nesnenin hash kodundan hesaplanan bir dizin kullanarak depolayarak yapar. Buraya bir bak
HashSet
benzersiz öğeler içeren sıralanmamış bir koleksiyon. Toplama, Kaldırma, İçerme gibi standart toplama işlemlerine sahiptir, ancak karma tabanlı bir uygulama kullandığından, bu işlemler O (1) 'dir. (Örneğin, İçerir ve Kaldır için O (n) olan List'in aksine. Birleşme , kavşak ve simetrik farkHashSet
gibi standart küme işlemleri de sağlar . Buraya bir bak
Setlerin farklı uygulamaları vardır. Bazıları, hash elemanları ile ekleme ve arama işlemlerini süper hızlı hale getirir. Ancak bu, öğelerin eklenme sırasının kaybolduğu anlamına gelir. Diğer uygulamalar, ek siparişi daha yavaş çalışma süreleri pahasına korur.
HashSet
C # sınıfı böylece ilk yaklaşım için gider değil öğelerin sırasını koruyarak. Normalden çok daha hızlıdır List
. Bazı temel ölçütler, HashSet'in birincil türlerle (int, double, bool vb.) İlgilenirken oldukça hızlı olduğunu gösterdi. Sınıf nesneleriyle çalışırken çok daha hızlıdır. Bu noktada HashSet hızlıdır.
Tek yakalama, HashSet
endekslerin erişiminin olmamasıdır. Elemanlara erişmek için ya bir numaralandırıcı kullanabilir ya da HashSet
içine a dönüştürmek List
ve bunu yinelemek için yerleşik işlevi kullanabilirsiniz . Buraya bir bak
A HashSet
, öğelerin hızlı bir şekilde aranabileceği ve tanımlanabileceği dahili bir yapıya (hash) sahiptir. Dezavantajı, bir HashSet
(veya bir öğeyi dizine göre alma) yoluyla yinelemenin oldukça yavaş olmasıdır.
Öyleyse neden bir kümede bir girdinin var olup olmadığını neden bilmek istesin ki?
A'nın HashSet
yararlı olduğu durumlardan biri , yinelemelerin olabileceği bir listeden farklı değerler elde etmektir. Bir öğe eklendikten sonra HashSet
, öğenin var olup olmadığını belirlemek hızlıdır ( Contains
operatör).
Diğer avantajları HashSet
Küme işlemleri şunlardır: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Nesne kısıtlama diline aşina iseniz, bu ayarlanmış işlemleri tanımlayacaksınız. Ayrıca, yürütülebilir UML uygulamasına bir adım daha yakın olduğunu göreceksiniz.
Basitçe söylemek gerekirse ve mutfak sırlarını açığa vurmadan:
genel olarak bir set, yinelenen öğeler içermeyen ve öğeleri belirli bir sırada olmayan bir koleksiyon. Bu nedenle, A HashSet<T>
bir jenerik ile benzerdir List<T>
, ancak sipariş kaybı pahasına hızlı aramalar için (adın ima ettiği gibi hashtables üzerinden) optimize edilmiştir.
Uygulama perspektifinden bakıldığında, yalnızca yinelenenleri önlemek için ihtiyacınız HashSet
varsa, Arama, Ekle ve Kaldır karmaşıklıkları O (1) - sabit olduğundan aradığınız şey budur . Bunun anlamı, ne kadar elemanın HashSet
olduğu önemli değildir, böyle bir eleman olup olmadığını kontrol etmek aynı zaman alacaktır, ayrıca O (1) 'de elemanlar eklediğiniz için bu tür şeyler için mükemmeldir.