111 votes

Liste vs vs Set sac dans NHibernate

Quelle est la différence entre une liste, le jeu et le sac dans le fichier de mappage NHibernate ? Comment chacun est lié aux collections .NET ?

234voto

Michael Gattuso Points 6536

NHibernate sémantique:

  1. Liste: collection Ordonnée d'entités, duplicata de permis. Utiliser un .net IList dans le code. La colonne d'index doivent être mappés dans NHibernate.

  2. Ensemble: collection non ordonnée de des entités uniques, des copies non autorisées. Utilisation Iesi.Collection.ISet dans le code. Il est important de remplacer GetHashCode et Égal à indiquer la définition d'affaires de duplicata. Peut être triée par la définition d'un orderby ou par la définition d'un comparateur résultant en une SortedSet résultat.

  3. Sac: liste non ordonnée d'entités, les doublons autorisés. Utiliser un .net IList dans le code. L'indice de colonne de la liste n'est pas mappé et pas honoré par NHibernate.

21voto

Jay Points 1450

Tous ces objets dans NHibernate sont exactement les mêmes que les autres implémentations de ces Types de Données Abstraite (ADT). J'ai été surpris de voir combien il est difficile de trouver des Ensembles et des Sacs en ligne en raison de la façon commune les noms sont pour d'autres choses, donc j'ai énuméré certains des liens et des descriptions ici.

Pour de plus amples détails, jetez un oeil à ce qui suit: Les listes, Jeuxet Sacs

Les règles générales sont les suivantes:

Les listes sont par défaut commandés, l'utilisation de ces si vous voulez être en mesure de sortir un objet par son index ou vous avez une étrange passion pour les boucles sur foreach boucles. Vous n'êtes pas obligé d'accéder dans l'ordre que vous auriez besoin d'une Liste Liée. Ce ADT permet de doublons.

Veuillez noter! Bien que les listes sont ordonnées comme BryanD a mentionné dans sa réponse, il n'y a absolument rien en disant qu'elle a à être dans l'ordre que vous êtes en mesure d'attendre de la base de données lorsque vous exécutez une requête HQL, sauf si vous spécifiez une commande par commande. C'est pour cette raison que certaines personnes aiment à utiliser Ensemble ou des Sacs au lieu de cela, de sorte qu'il ne donne pas l'illusion de la commande. Si je dis cela, la plupart du temps, ils semblent être dans un ordre visible, comme ils sont ajoutés à la liste dans l'ordre où ils sont présents dans la requête que NHibernate s'exécute.

Les ensembles sont pas par défaut commandé, vous ne pouvez pas accéder à toutes les variables directement via un index. Les ensembles sont, par défaut, la seule ADT de trois ci-dessus qui maintiennent la singularité de ses objets. Ces sont parfaits si vous avez une collection si vous avez besoin de ne pas contenir de doublons.

Des sacs (ou Multisets) sont, comme vous pouvez le voir à partir des liens ci-dessus, un type de Jeu qui ne permet pas d'objets à l'intérieur des doubles d'autres objets. Ils ne sont généralement pas utilisés, comme des Listes de commande peut être ignoré, et donc traité comme un Sac.

En fonction de la façon dont ils sont utilisés dans NHibernate, rien n'est tiré de la base de données différemment selon l'ADT vous sélectionnez ici, c'est ce que vous voulez l'utiliser pour qui devrait vous faire choisir les différentes ADT.

Personnellement, j'utilise Jeux pour la plupart des choses que j'ai généralement besoin de l'enfant d'objets uniques et de commande n'est pas un problème. Je crois que je vais utiliser des Listes où j'ai un groupe d'objets qui je veux commandés par quelque chose, par exemple le temps pour atteindre cette commande, j'ai besoin de régler manuellement le "order by dans la requête HQL.

1voto

BryanD Points 1312

Eh bien, la différence principale est que les listes ont un ordre implicite aux éléments, indexés selon leur position dans la liste. Ensembles et sacs peuvent aussi être « commandés » généralement par un groupe de comparaison ou d’une ordonnance par clause qui s’applique lorsque ceux-ci sortent de la DB. Personnellement, je n’ai jamais utilisé sacs... si je connais les données je veux sont classées dans l’ordre que j’utilise la liste sinon j’utiliser ensemble.

0voto

Sly Points 8146

N’est pas réglée permet d’ont répété des éléments dedans. Si vous essayez d’ajouter un nouvel élément, il comparera (Equals méthode sert) chaque élément qui est déjà en collection avec celle que vous ajoutez, et si un renvoie true, élément ne sera ajouté

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X