¿Cuál es la diferencia entre una lista, conjunto y bolsa en el archivo de mapeo NHibernate? ¿Cómo se relaciona cada uno con las colecciones de .NET?List vs Set vs Bag en NHibernate
Respuesta
la semántica de NHibernate:
lista: Colección ordenada de entidades, duplicadas permitidas. Use un .NET
IList
en el código. La columna de índice deberá estar asignada en NHibernate.Conjunto: colección desordenada de entidades únicas, duplicados no permitidos. Use
Iesi.Collection.ISet
en el código (NH anterior a v4) oSystem.Collections.Generic.ISet
(NH v4 +). Es importante sobrescribirGetHashCode
yEquals
para indicar la definición comercial de duplicado. Puede ordenarse definiendo un pedido por o definiendo un comparador que dé como resultado un resultado deSortedSet
.Bolsa: Lista desordenada de entidades, duplicados permitidos. Use un .NET
ICollection<T>
en el código. La columna de índice de la lista no está asignada y no cumple NHibernate.
Bueno, la principal diferencia es que las listas tienen un orden implícito a los elementos, indexados por su posición en la lista. Los conjuntos y las bolsas también pueden ser "pedidos" generalmente por un Comparador o una cláusula de orden por que se aplica cuando esos elementos salen de la base de datos. Personalmente, nunca he usado Bags ... si sé que los datos que deseo se ordenan secuencialmente, uso List; de lo contrario, uso Set.
El conjunto no le permite tener elementos repetidos en él. Si intenta agregar algún elemento nuevo, comparará (se usa el método Equals) cada elemento que ya está en la colección con el que está agregando, y si uno vuelve a ser verdadero, el elemento no se agregará
Todos estos objetos en NHibernate son exactamente lo mismo que otras implementaciones de estos Tipos de datos abstractos (ADT). Me sorprendió lo difícil que es encontrar conjuntos y bolsos en línea debido a lo comunes que son los nombres para otras cosas, así que he enumerado algunos enlaces y descripciones aquí.
Para obtener información más detallada echar un vistazo a los siguientes: Lists, Sets y Bags
Las reglas generales son:
Listas son por defecto ordenó, utilizar estos si desea ser capaz de sacar un objeto por su índice o tiene una afición extraña de for
bucles sobre foreach
bucles. No es necesario que accedas a ellos en orden como lo necesitarías en un Linked List. Este ADT permite duplicados.
¡Atención! Aunque las listas se ordenan como BryanD se menciona en su respuesta, , no hay absolutamente nada que indique que tiene que estar en el orden que espera de la base de datos cuando ejecuta una consulta HQL a menos que especifique una orden por comando. Es debido a esto que a algunas personas les gusta usar Set o Bags en su lugar, por lo que no da la ilusión de que se lo pidan. Aunque digo esto, la mayoría de las veces parecerán estar en un orden visible, ya que se agregan a la lista en el orden en que se encuentran en la consulta que ejecuta NHibernate.
Conjuntos son no por defecto ordenó, no se puede acceder a cualquier variable directamente a través de un índice. Los conjuntos son por defecto el solo ADT de los tres anteriores que mantienen la singularidad de sus objetos. Estos son excelentes si tiene una colección si necesita no contener duplicados.
Bolsas (o conjuntos múltiples ) son, como se puede ver en los enlaces de arriba, un tipo de conjunto, que sí permite a los objetos dentro de él para ser duplicados de otros objetos. Estos no se usan generalmente, ya que el orden de las Listas se puede ignorar y, por lo tanto, se puede tratar como una Bolsa.
En relación con cómo se utilizan en NHibernate, no se extrae nada de la base de datos de forma diferente según el ADT que seleccione aquí, es lo que desea usar para que pueda elegir entre los diferentes ADT.
Personalmente, utilizo Sets para la mayoría de las cosas, ya que generalmente exijo que los objetos secundarios sean únicos y ordenar no es un problema.Aunque usaré Lists donde tengo un grupo de objetos que deseo ordenado por algo, por ejemplo tiempo, para lograr este orden necesito configurar manualmente el "orden por" en la consulta HQL.
Corrección en la lista - utilizando una lista en un archivo de mapeo NHibernate. Será necesario mapear una columna de índice. De esta forma, la lista se extraerá en el orden exacto en que fue colocada. –
@Michael Gattuso. Buen punto, debería haber mencionado en la respuesta anterior que estaba hablando de consultas HQL (de ahí el comentario 'ordenar por') en lugar de la especificación de la colección real en su archivo de mapeo. – Jay
Una de las ventajas del uso de bolsas es que no tienen que cargarse de la base de datos cuando se agregan elementos nuevos. No hay duplicados para verificar, no hay orden para determinar. – tvaananen
- 1. ¿EF tiene colecciones ordenadas? El equivalente de la lista en el mundo NHibernate Bag Vs Set Vs List
- 2. List.empty vs. List() vs. new List()
- 3. AtomicInteger lazySet vs. set
- 4. Modelado de series de tiempo en f # - seq vs array vs vector vs list vs generic list
- 5. System.Collections.Generic.Dictionary `Add` vs set` Item`
- 6. Python numpy array vs list
- 7. cuándo usar Set vs. Collection?
- 8. Realloc Vs Linked List Scanning
- 9. NHibernate vs. EF 4.1+
- 10. NHibernate Fluido vs. Atributos
- 11. NHibernate - ISession vs. IStatelessSession
- 12. Subsonic Vs NHibernate
- 13. NHibernate ISet Vs IList
- 14. NHibernate HQL vs CriteriaAPI vs QueryOver vs Linq. Rendimiento
- 15. Lightspeed vs NHibernate
- 16. NHibernate - createCriteria vs CreateAlias
- 17. mylist = list() vs mylist = [] en Python
- 18. ¿Diferencias significativas en Array vs Array List?
- 19. tuple vs list objects en python
- 20. HasOne vs Referencias Mapping Fluido NHibernate
- 21. NHibernate vs LINQ to SQL
- 22. NHibernate Composite Key vs Composite Unique Constraint
- 23. NHibernate Component Mapping VS IUserType
- 24. HSET vs SET ¿uso de memoria?
- 25. SET vs. SELECT - ¿Cuál es la diferencia?
- 26. std :: list vs std :: vector iteration
- 27. ObservableCollection <> vs. List <>
- 28. SaveOrUpdate Vs Actualizar y guardar en NHibernate
- 29. IEnumerable vs List in the Response Class, ServiceStack
- 30. Lista @OneToMany <> vs Set <> diferencia
3. debería ser ICollection en el código no? –
Firo
Re: # 2, ¿no podemos usar simplemente 'ISet' regular en lugar de' Iesi'? –
@SergeyTachenov: vea http://stackoverflow.com/questions/9222058/can-net-4-iset-hashset-replace-nhibernate-iesi-collections-iset-hashset para obtener una posible respuesta. Cuando se escribió esta respuesta, ISet no formaba parte de .net –