2012-06-21 27 views
23

Yapıcıda "hashset" kullanmadan veya kullanmadan sınıf oluşturma arasındaki farkın ne olduğunu bilmek istiyorum.varlık çerçevesindeki hashset'i kullanma

public class Blog 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string BloggerName { get; set;} 
    public virtual ICollection<Post> Posts { get; set; } 
    } 

public class Post 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Content { get; set; } 
    public int BlogId { get; set; } 
    public ICollection<Comment> Comments { get; set; } 
} 

veya böyle modeller oluşturabilirsiniz:

biri böyle modeller creat olabilir kod birinci yaklaşımı (4.3) kullanarak

public class Customer 
{ 
    public Customer() 
    { 
     BrokerageAccounts = new HashSet<BrokerageAccount>(); 
    } 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public ICollection<BrokerageAccount> BrokerageAccounts { get; set; } 
} 

public class BrokerageAccount 
{ 

    public int Id { get; set; } 
    public string AccountNumber { get; set; } 
    public int CustomerId { get; set; } 

} 

HashSet burada ne işi var?

Ayrıca ilk iki modelde hashset kullanmalı mıyım?

hashset uygulamasını gösteren herhangi bir makale var mı?

cevap

12

Entity Framework'e oldukça yeni geldim ancak bu benim anlayışım. Koleksiyon türleri, ICollection<T>'u uygulayan herhangi bir tür olabilir. Kanımca bir HashSet genellikle semantik olarak doğru toplama türüdür. Koleksiyonların çoğunun yalnızca bir üyenin bir kopyası olmalıdır (çoğaltılmamış) ve HashSet bunu en iyi şekilde ifade eder. Sınıflarımı aşağıda gösterildiği gibi yazdım ve bu çok işe yaradı. Koleksiyonun ISet<T> olarak yazıldığını ve ayarlayıcının gizli olduğunu unutmayın.

public class Customer 
{ 
    public Customer() 
    { 
     BrokerageAccounts = new HashSet<BrokerageAccount>(); 
    } 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public ISet<BrokerageAccount> BrokerageAccounts { get; private set; } 
} 
+1

Tamamen katılıyorum. Çoğu durumda 'HashSet' * en doğal uyumdur. –

+0

hashset hala EF6.x'te doğru görünüyor. Doğal olarak, EF, db-ilk türlerinin yaratılması sırasında bu kesin şekilde hashları kullanacaktır. –

16

Genel olarak, en iyi niyetinizi ifade eden koleksiyonu kullanmak en iyisidir. HashSet'in benzersiz özelliklerini özellikle kullanmayı düşünmüyorsanız, onu kullanmazdım.

Sırasıyla aramalar dizine göre desteklenmiyor ve desteklenmiyor. Ayrıca, diğer koleksiyonlar kadar ardışık okumalar için de uygun değildir ve aynı ürünü çoğaltmalar oluşturmadan birden çok kez eklemenize izin vermesi, sadece bunun için bir nedeniniz varsa yararlıdır. Bu sizin niyetiniz değilse, yanlış davranış kodlarını gizleyebilir ve yalıtılması zor problemler çıkarabilir.

HashSet çoğunlukla, verileri işlerken olduğu gibi ekleme ve çıkarma sürelerinin çok önemli olduğu durumlarda yararlıdır. Aynı zamanda, kesişim, istisna ve birleşme gibi işlemleri kullanarak veri kümelerini (işlem sırasında tekrar) karşılaştırmak için de son derece kullanışlıdır. Diğer herhangi bir durumda, eksiler genellikle profesyonellerden ağır basar.

Blog yazılarıyla çalışırken, ekler ve kaldırmalar okumalara göre oldukça nadirdir ve genellikle verileri belirli bir sırayla okumak isteyebilirsiniz. Bu, HashSet'in iyi olduğu şeyin tam tersi. Herhangi bir nedenle aynı gönderiyi iki kez eklemeyi düşünmeniz son derece şüphelidir ve neden böyle bir sınıftaki yayınlarda set tabanlı işlemleri kullanacağınız konusunda hiçbir neden göremiyorum.

8

HashSet, verileri gerçekten aldığınızda oluşturulacak koleksiyon türünü tanımlamaz. Bu her zaman beyan edildiği gibi tip ICollection olacaktır.

Yapıcıda oluşturulan HashSet, hiçbir kayıt alınmadığında veya ilişkinin birçok tarafında bulunmadığında NullReferenceExceptions'tan kaçınmanıza yardımcı olmaktır. Hiçbir şekilde gerekli değildir. Hiçbir Mesajlar varsa aşağıdaki gibi bir ilişki kullanmaya çalıştığınızda sorunuza dayalı Örneğin

...

var myCollection = Blog.Posts(); 

sonra myCollectionnull olacaktır.Akıcı zincir şeyler ve bir NullReferenceException ile hata olacaktır

var myCollectionCount = Blog.Posts.Count(); 

böyle bir şey yapmak kadar Hangi sorun yok.

var myCollection = Customer.BrokerageAccounts(); 
var myCollectionCount = Customer.BrokerageAccounts.Count(); 

olarak ve boş ıcollection sonuçlanacaktır

ve sıfır sayılır. İstisnalar yok :-)

+2

'()' özelliklerde geçerli ('Blog.Posts()') var mı? Sadece "Blog.Posts" alanına erişmesi gerekmiyor mu? – bradlis7

+0

Bu yanlış görünüyor. Hata ayıklayıcı, veri tabanından getirilen veriler için bile, kurucumda tam olarak kullandığım türü gösterir. Bu ayrıca koleksiyona erişirken farklı davranışlara da yansır (örn. Koleksiyonlarda DataBinding aracılığıyla). – linac

+1

@linac Geri dönüş türünü tanımlayan HashSet değil, ICollection özelliğinin tanımı. HashSet, ICollection özelliğini yalnızca başlatmak için kullanılır. Özelliği yapıcıda başlatmazsanız, hata ayıklayıcı hala tanımlandığı gibi ICollection türünü gösterecektir. HashSet ile ilgisi yok! – NER1808

İlgili konular