NHibernate'de Liste vs Set vs Çanta


109

NHibernate eşleme dosyasında liste, küme ve çanta arasındaki fark nedir? Her biri .NET koleksiyonlarıyla nasıl ilişkilidir?

Yanıtlar:


230

NHibernate semantiği:

  1. Liste: Varlıkların sıralı koleksiyonu, kopyaya izin verilir. Kodda bir .NET kullanın IList. Dizin sütununun NHibernate'de eşlenmesi gerekecektir.

  2. Set: Sırasız benzersiz varlık koleksiyonu, kopyalara izin verilmez. Iesi.Collection.ISetKodda kullanın (v4'ten önceki NH) veya System.Collections.Generic.ISet(NH v4 +). Yinelenen iş tanımını geçersiz kılmak GetHashCodeve Equalsbelirtmek önemlidir . Bir sıralama tanımlanarak veya bir SortedSetsonuçla sonuçlanan bir karşılaştırıcı tanımlanarak sıralanabilir .

  3. Çanta: Sırasız varlık listesi, kopyalara izin verilir. Kodda bir .NET kullanın ICollection<T>. Listenin dizin sütunu eşlenmemiştir ve NHibernate tarafından dikkate alınmamıştır.


Re: # 2, ISetyerine sadece normal kullanamaz mıyız Iesi?
Sergei Tachenov

@SergeyTachenov: Olası bir cevap için stackoverflow.com/questions/9222058/… adresine bakın . Bu cevap yazıldığında ISet .net'in bir parçası değildi
Michael Gattuso

Bu soruya verilecek en az popüler cevap evet, çünkü NHibernate 4. Bu yüzden belki bu sorunun da düzeltilmesi gerekiyor.
Sergei Tachenov

21

NHibernate'deki tüm bu nesneler, bu Soyut Veri Tiplerinin (ADT) diğer uygulamaları ile tamamen aynıdır. Diğer şeyler için isimlerin ne kadar yaygın olduğu için Setleri ve Çantaları çevrimiçi olarak bulmanın ne kadar zor olduğuna şaşırdım, bu yüzden burada bazı bağlantılar ve açıklamalar listeledim.

Daha ayrıntılı bilgi için aşağıdakilere bir göz atın: Listeler , Setler ve Çantalar

Genel kurallar:

Listeler varsayılan olarak sıralanmıştır, bir nesneyi dizinine göre çekebilmek istiyorsanız veya fordöngülerin üzerinden tuhaf bir döngü düşkünlüğünüz varsa bunları kullanın foreach. Bir Bağlantılı Listede olması gerektiği gibi bunlara erişmeniz gerekmez . Bu ADT, kopyalara izin verir.

Lütfen aklınızda bulundurun! Listeler BryanD'nin cevabında belirtildiği gibi sıralanmasına rağmen, komuta göre bir sıralama belirtmediğiniz sürece bir HQL sorgusu yürüttüğünüzde veritabanından beklediğiniz sırada olması gerektiğini söyleyen hiçbir şey yoktur. Bu nedenle, bazı insanlar bunun yerine Set veya Bags kullanmayı severler, böylece sipariş verildiği yanılsamasını vermez. Bunu söylememe rağmen, NHibernate'in çalıştırdığı sorguda bulunma sırasına göre listeye eklendiklerinden çoğu zaman görünür bir sırada görünecekler.

Setler vardır değil varsayılan sipariş ederek, dizin kullanarak doğrudan herhangi bir değişkeni erişemez. Kümeler varsayılan olarak, nesnelerinin benzersizliğini koruyan yukarıdaki üç ADT'den tek ADT'dir . Kopya içermemeniz gerekiyorsa, bir koleksiyonunuz varsa bunlar harikadır.

Çantalar (veya Çoklu Kümeler ), yukarıdaki bağlantılardan da görebileceğiniz gibi, içindeki nesnelerin diğer nesnelerin kopyası olmasına izin veren bir Küme türüdür. Liste sıralaması göz ardı edilebileceğinden ve bu nedenle Çanta olarak değerlendirilebileceğinden, bunlar genellikle kullanılmaz.

Bunların NHibernate'de nasıl kullanıldığına bağlı olarak, burada hangi ADT'yi seçtiğinize bağlı olarak veritabanından hiçbir şey farklı şekilde çekilmez, farklı ADT'yi seçmeniz için onu kullanmak istediğiniz şey budur.

Kişisel olarak, genellikle alt nesnelerin benzersiz olmasını istediğim ve sıralama bir sorun olmadığından çoğu şey için Setleri kullanıyorum. Örneğin, bir şeye göre sıralanmasını istediğim bir grup nesneye sahip olduğum Listeleri kullanacak olsam da, bu sırayı elde etmek için HQL sorgusunda "sıralama ölçütü" nü manuel olarak ayarlamam gerekiyor.


2
Listedeki Düzeltme - NHibernate eşleme dosyasındaki bir listenin kullanılması, bir dizin sütununun eşleştirilmesini gerektirir. Bu şekilde liste tam olarak yerleştirildiği sırada çıkarılacaktır.
Michael Gattuso

@Michael Gattuso İyi bir nokta, yukarıdaki cevapta, eşleme dosyanızdaki gerçek koleksiyon belirtiminden ziyade HQL sorgularından (dolayısıyla 'sıralama' yorumundan) bahsettiğimi belirtmeliydim.
Jay

Çanta kullanmanın bir yararı, yeni öğeler eklediğinizde veritabanından yüklenmeleri gerekmemesidir. Kontrol edilecek kopya yok, belirlenecek sipariş yok.
tvaananen

1

Temel fark, listelerin, listedeki konumlarına göre indekslenmiş öğeler için örtük bir sıralamaya sahip olmasıdır. Setler ve çantalar, genellikle bir Karşılaştırıcı tarafından veya bu öğeler DB'den çıktığında uygulanan maddeye göre "sıralanabilir". Kişisel olarak, hiç Çanta kullanmadım ... İstediğim verilerin sıralı olarak sıralandığını bilirsem List'i, yoksa Set'i kullanırım.


0

Set, içinde yinelenen öğeler bulundurmanıza izin vermez. Yeni bir öğe eklemeye çalışırsanız, koleksiyonda bulunan her bir öğeyi eklediğiniz öğe ile karşılaştırır (Eşittir yöntemi kullanılır) ve eğer biri doğru olarak yeniden çalıştırılırsa öğe eklenmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.