В чем разница между списком, набором и сумкой в файле сопоставления NHibernate? Как каждый связан с коллекциями .NET?
источник
В чем разница между списком, набором и сумкой в файле сопоставления NHibernate? Как каждый связан с коллекциями .NET?
Семантика NHibernate:
Список: упорядоченный набор сущностей, дублирование разрешено. Используйте .NET IList
в коде. Столбец индекса необходимо отобразить в NHibernate.
Набор: неупорядоченный набор уникальных сущностей, дублирование не допускается. Используйте Iesi.Collection.ISet
в коде (NH до v4) или System.Collections.Generic.ISet
(NH v4 +). Важно переопределить GetHashCode
и Equals
указать бизнес-определение дубликата. Может быть отсортирован путем определения порядка или путем определения компаратора, приводящего к SortedSet
результату.
Пакет: неупорядоченный список сущностей, дубликаты разрешены. Используйте .NET ICollection<T>
в коде. Столбец индекса в списке не отображается и не обрабатывается NHibernate.
ISet
вместо обычногоIesi
?Все эти объекты в NHibernate точно такие же, как и другие реализации этих абстрактных типов данных (ADT). Я был удивлен, насколько сложно найти наборы и сумки в Интернете из-за того, насколько распространены названия для других вещей, поэтому я привел здесь некоторые ссылки и описания.
Для получения более подробной информации взгляните на следующее: Списки , наборы и сумки
Общие правила таковы:
Списки по умолчанию упорядочены, используйте их, если вы хотите иметь возможность извлекать объект по его индексу или у вас есть странная любовь к
for
циклам заforeach
циклами. Вам не обязательно получать к ним доступ, как если бы это было в связанном списке . Этот ADT позволяет дублировать.Пожалуйста, обратите внимание! Хотя списки упорядочены так, как BryanD упомянул в своем ответе, абсолютно ничего не говорится о том, что они должны быть в том порядке, который вы ожидаете от базы данных при выполнении запроса HQL, если вы не укажете порядок по команде. Именно из-за этого некоторые люди предпочитают использовать Set или Bags вместо этого, чтобы не создавалось иллюзии, будто их заказали. Хотя я говорю это, в большинстве случаев они будут отображаться в видимом порядке, поскольку они добавляются в список в том порядке, в котором они находятся в запросе, выполняемом NHibernate.
Наборы являются не по умолчанию упорядочены, вы не можете получить доступ к любой переменной непосредственно через индекс. Наборы по умолчанию являются единственным ADT из трех вышеупомянутых, которые сохраняют уникальность своих объектов . Это здорово, если у вас есть коллекция, если вам не нужно содержать дубликаты.
Сумки (или Мультимножества ), как вы можете видеть из приведенных выше ссылок, представляют собой тип набора, который позволяет объектам внутри него быть дубликатами других объектов. Обычно они не используются, так как порядок списков можно игнорировать и, следовательно, рассматривать как мешок.
Что касается того, как они используются в NHibernate, ничто не извлекается из базы данных по-разному, в зависимости от того, какой ADT вы здесь выбираете, именно то, что вы хотите использовать, должно заставить вас выбрать другой ADT.
Лично я использую наборы для большинства вещей, так как обычно требую, чтобы дочерние объекты были уникальными, и порядок не является проблемой. Хотя я буду использовать списки, где у меня есть группа объектов, которые я хочу упорядочить по чему-то, например по времени, для достижения этого порядка мне нужно вручную установить «порядок по» в запросе HQL.
источник
Основное отличие состоит в том, что списки имеют неявный порядок элементов, индексируемый по их положению в списке. Наборы и пакеты также могут быть «упорядочены» обычно с помощью компаратора или пункта order by, который применяется, когда эти элементы выходят из БД. Лично я никогда не использовал сумки ... если я знаю, что данные, которые мне нужны, упорядочиваются последовательно, я использую List, в противном случае я использую Set.
источник
Set не позволяет иметь в себе повторяющиеся элементы. Если вы попытаетесь добавить какой-то новый элемент, он сравнит (используется метод Equals) каждый элемент, который уже находится в коллекции, с тем, который вы добавляете, и если один из них вернется в истинное состояние, элемент не будет добавлен.
источник