Список проти набору проти мішка в NHibernate


109

Яка різниця між списком, набором та мішком у файлі картографування NHibernate? Як кожен стосується колекцій .NET?

Відповіді:


230

NHibernate семантика:

  1. Список: упорядкований збір об'єктів, дозволений дублікат. Використовуйте .NET IListу коді. Індексний стовпчик потрібно буде відобразити в NHibernate.

  2. Набір: Не упорядкована колекція унікальних об'єктів, копії не дозволені Використовуйте Iesi.Collection.ISetв коді (NH до v4) або System.Collections.Generic.ISet(NH v4 +). Важливо переосмислити GetHashCodeта Equalsвказати ділове визначення дубліката. Можна відсортувати, визначивши порядок замовлення або визначивши порівняльник, що призводить до SortedSetрезультату.

  3. Сумка: Не упорядкований список об'єктів, дозволені копії. Використовуйте .NET ICollection<T>у коді. Сторінка індексу списку не відображається та не шанується NHibernate.


Re: # 2, чи не можемо ми використовувати звичайні ISetзамість них Iesi?
Сергій Таченов

@SergeyTachenov: см stackoverflow.com/questions/9222058 / ... для можливої відповіді. Коли ця відповідь була написана, ISet не входив до .net
Michael Gattuso

Найменш популярна відповідь на це питання - так, оскільки NHibernate 4. Тож, можливо, це питання теж потрібно відредагувати.
Сергій Таченов

21

Усі ці об’єкти в NHibernate точно такі ж, як і в інших реалізаціях цих абстрактних типів даних (ADT). Мене здивувало, як важко знайти набори та сумки в Інтернеті через те, наскільки поширені назви для інших речей, тому я перерахував тут деякі посилання та описи.

Для отримання більш детальної інформації дивіться наступне: Списки , набори та сумки

Загальні правила:

Списки за замовчуванням упорядковані, використовуйте їх, якщо ви хочете мати можливість витягнути об’єкт за його покажчиком або у вас є дивна прихильність до forпетель над foreachпетлями. Ви не зобов’язані отримувати доступ до них у порядку, як вам потрібно в списку зв'язаних . Цей ADT дозволяє копії.

Будь ласка, запиши! Хоча списки упорядковані так, як згадував BryanD у своїй відповіді, абсолютно нічого не говорить про те, що він повинен бути в тому порядку, який ви очікуєте від бази даних, коли ви будете виконувати запит HQL, якщо ви не вказали замовлення командою. Саме тому деякі люди люблять використовувати набір або сумки замість цього, так що це не дає ілюзії замовлення. Хоча я і кажу про це, більшість часу вони здаються у видимому порядку, оскільки вони додаються до списку в тому порядку, який вони знайшли у запиті, який проводить NHibernate.

Набори є НЕ за замовчуванням впорядковані, ви не можете отримати доступ до будь-якої змінної безпосередньо через індекс. Набори за замовчуванням є єдиним ADT з вищезгаданих трьох, які підтримують унікальність його об'єктів . Вони чудові, якщо у вас є колекція, якщо вам потрібно не містити дублікатів.

Мішки (або мультисети ) - це, як видно з посилань вище, тип набору, який дозволяє об'єктам, що знаходяться в ньому, бути дублікатами інших об'єктів. Вони, як правило, не використовуються, оскільки замовлення списків можна ігнорувати, а отже, трактувати як Сумка.

Що стосується того, як вони використовуються в NHibernate, з бази даних нічого не витягується по-різному, залежно від того, який ADT ви вибрали тут, саме те, що ви хочете використовувати для цього, повинно змусити вас вибрати інший ADT.

Особисто я використовую набори для більшості речей, оскільки я, як правило, вимагаю, щоб дочірні об’єкти були унікальними, і замовлення - це не проблема. Хоча я буду використовувати Списки, де у мене є група об'єктів, які я хочу замовити чимось, наприклад, часом, щоб досягти цього порядку, мені потрібно вручну встановити "порядок" у запиті HQL.


2
Виправлення списку - використання списку у файлі картографування NHibernate WILL вимагає відображення стовпця індексу. Таким чином, список буде виведено в тому порядку, в якому він був введений.
Майкл Гаттузо

@Michael Gattuso Добре, я мав би зазначити у відповіді вище, що я говорив про HQL-запити (звідси "замовлення за коментарем"), а не про фактичну специфікацію колекції у вашому картографічному файлі.
Джей

Одна з переваг використання мішків полягає в тому, що їх не потрібно завантажувати з бази даних, коли ви додаєте до нього нові елементи. Немає дублікатів для перевірки, немає порядку визначення.
tvaananen

1

Ну а головна відмінність полягає в тому, що списки мають неявне впорядкування елементів, індексоване їх положенням у списку. Набори та сумки також можуть бути «замовлені» компаратором або наказом за умовами, які застосовуються, коли ці елементи виходять із БД. Особисто я ніколи не використовував Сумки ... якщо я знаю, що потрібні мені дані впорядковуються послідовно, я використовую Список, інакше я використовую Set.


0

Набір не дозволяє мати в ньому повторні елементи. Якщо ви спробуєте додати якийсь новий елемент, він порівняє (використовується метод рівних) кожного елемента, який вже є в колекції, з тим, який ви додаєте, і якщо один повторно встановить істину, елемент не буде додано

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.