¿Cuál es la diferencia entre una lista, un conjunto y una bolsa en el archivo de mapeo NHibernate? ¿Cómo se relaciona cada uno con las colecciones .NET?
fuente
¿Cuál es la diferencia entre una lista, un conjunto y una bolsa en el archivo de mapeo NHibernate? ¿Cómo se relaciona cada uno con las colecciones .NET?
Semántica NHibernate:
Lista: colección ordenada de entidades, se permiten duplicados. Utilice un .NET IList
en el código. La columna de índice deberá mapearse en NHibernate.
Conjunto: colección desordenada de entidades únicas, no se permiten duplicados. Úselo Iesi.Collection.ISet
en el código (NH antes de v4) o System.Collections.Generic.ISet
(NH v4 +). Es importante anular GetHashCode
e Equals
indicar la definición empresarial de duplicado. Se puede ordenar definiendo un orden por o definiendo un comparador que dé como resultado un SortedSet
resultado.
Bolsa: Lista desordenada de entidades, se permiten duplicados. Utilice un .NET ICollection<T>
en el código. La columna de índice de la lista no está mapeada ni respetada por NHibernate.
ISet
lugar deIesi
?Todos estos objetos en NHibernate son exactamente iguales que otras implementaciones de estos tipos de datos abstractos (ADT). Me sorprendió lo difícil que es encontrar conjuntos y bolsas en línea debido a lo comunes que son los nombres para otras cosas, por lo que he enumerado algunos enlaces y descripciones aquí.
Para obtener información más detallada, consulte lo siguiente: Listas , juegos y bolsas
Las reglas generales son:
Las listas están ordenadas por defecto, utilícelas si desea poder extraer un objeto por su índice o si le gustan los
for
bucles sobre losforeach
bucles. No es necesario que acceda a ellos en el orden en que lo haría en una lista vinculada . Este ADT permite duplicados.¡Tenga en cuenta! Aunque las listas están ordenadas como BryanD mencionó en su respuesta, no hay absolutamente nada que diga que tiene que estar en el orden que espera de la base de datos cuando ejecuta una consulta HQL a menos que especifique un orden por comando. Es por esto que a algunas personas les gusta usar Set o Bags en su lugar, para que no dé la ilusión de estar ordenado. Aunque digo esto, la mayoría de las veces aparecerán en un orden visible, ya que se agregan a la lista en el orden en que se encuentran en la consulta que ejecuta NHibernate.
Los conjuntos no están ordenados por defecto, no puede acceder a ninguna variable directamente a través de un índice. Los conjuntos son por defecto el único ADT de los tres anteriores que mantienen la singularidad de sus objetos . Estos son excelentes si tiene una colección si necesita que no contenga duplicados.
Las bolsas (o conjuntos múltiples ) son, como puede ver en los enlaces anteriores, un tipo de conjunto que permite que los objetos dentro de él sean duplicados de otros objetos. Estos no se utilizan generalmente, ya que el orden de las listas se puede ignorar y, por lo tanto, se tratan como una bolsa.
En relación a cómo se usan estos en NHibernate, nada se extrae de la base de datos de manera diferente dependiendo de qué ADT seleccione aquí, es para lo que desea usarlo lo que debería hacer que elija los diferentes ADT.
Personalmente, utilizo Sets para la mayoría de las cosas, ya que generalmente requiero que los objetos secundarios sean únicos y el orden no es un problema. Aunque usaré Listas donde tenga un grupo de objetos que quiero ordenar por algo, por ejemplo, el tiempo, para lograr este orden, necesito establecer manualmente el "orden por" en la consulta HQL.
fuente
Bueno, la principal diferencia es que las listas tienen un orden implícito de los elementos, indexados por su posición en la lista. Los juegos y bolsas también pueden ser "ordenados" generalmente por un Comparador o una cláusula de orden por que se aplica cuando esos artículos salen del DB. Personalmente, nunca he usado Bags ... si sé que los datos que quiero están ordenados secuencialmente, uso List; de lo contrario, uso Set.
fuente
Establecer 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 devuelve verdadero, el elemento no se agregará
fuente