Tengo una lista
List<MyObject> myList
y estoy agregando elementos a una lista y quiero verificar si ese objeto ya está en la lista.
así que antes de hacer esto:
myList.Add(nextObject);
Quiero ver si nextObject ya está en la lista.
El objeto "MyObject" tiene varias propiedades, pero la comparación se basa en la coincidencia de dos propiedades.
¿Cuál es la mejor manera de hacer una verificación antes de agregar un nuevo "MyObject" a esta lista de "MyObject"?
La única solución que pensé fue cambiar de una lista a un diccionario y luego convertir la clave en una cadena concatenada de las propiedades (esto parece un poco poco elegante).
¿Alguna otra solución más limpia usando list o LINQ o algo más?
Simplemente use el método Contiene . Tenga en cuenta que funciona en función de la función de igualdad
Equals
fuente
Si se puede mantener el uso de esas 2 propiedades, podría:
fuente
¿Está seguro de que necesita una lista en este caso? Si está completando la lista con muchos elementos, el rendimiento se verá afectado con
myList.Contains
omyList.Any
; el tiempo de ejecución será cuadrático. Es posible que desee considerar el uso de una mejor estructura de datos. Por ejemplo,Puede usar un HashSet de la siguiente manera:
Por supuesto, si esta definición de igualdad para
MyClass
es "universal", no es necesario escribir unaIEqualityComparer
implementación; podría simplemente anularGetHashCode
yEquals
en la propia clase.fuente
Otro punto a mencionar es que debe asegurarse de que su función de igualdad sea la que espera. Debe anular el método equals para configurar qué propiedades de su objeto deben coincidir para que dos instancias se consideren iguales.
Entonces puedes simplemente hacer mylist.contains (item)
fuente
Aquí hay una aplicación de consola rápida para representar el concepto de cómo resolver su problema.
¡Disfrutar!
fuente
Editar: primero dije:
¿Qué tiene de elegante la solución del diccionario? Me parece perfectamente elegante, especialmente porque solo necesita configurar el comparador en la creación del diccionario.
Sin embargo, por supuesto, no es elegante usar algo como clave cuando también es el valor.
Por lo tanto, usaría un HashSet. Si las operaciones posteriores requerían indexación, crearía una lista a partir de ella cuando se realizara la adición; de lo contrario, solo use el hashset.
fuente
Simple pero funciona
o
fuente
Si usa EF core, agregue
Ejemplo
fuente