Tengo una clase Items
con properties (Id, Name, Code, Price)
.
La lista de Items
se rellena con elementos duplicados.
Por ej .:
1 Item1 IT00001 $100
2 Item2 IT00002 $200
3 Item3 IT00003 $150
1 Item1 IT00001 $100
3 Item3 IT00003 $150
¿Cómo eliminar los duplicados en la lista usando linq?
c#
linq
linq-to-objects
generic-list
Prasad
fuente
fuente
var set = new HashSet<int>(); var uniques = items.Where(x => set.Add(x.Id));
. Debería ser criminal hacerlo ...Respuestas:
Para hacer coincidir solo algunas de las propiedades, cree un comparador de igualdad personalizado, por ejemplo:
Entonces úsalo así:
fuente
GroupBy
no podía.XoR
operador^
en C #. Lo había usado en VB.NET a través de,Xor
pero tuve que hacer una doble toma de su código para ver qué era al principio.1[DataAccess.HR.Dao.CCS_LOCATION_TBL] Distinct[CCS_LOCATION_TBL](System.Linq.IQueryable
1 [DataAccess.HR.Dao.CCS_LOCATION_TBL], System.Collections.Generic.IEqualityComparer`1 [ DataAccess.HR.Dao.CCS_LOCATION_TBL]) ', y este método no se puede traducir a una expresión de tienda.fuente
Si hay algo que está desechando su consulta Distinct, es posible que desee mirar MoreLinq y usar el operador DistinctBy y seleccionar objetos distintos por id.
fuente
Así es como pude agruparme con Linq. Espero eso ayude.
fuente
FirstOrDefault
aquí no ofrece ningún beneficio siSelect
sigue inmediatamenteGroupBy
, ya que no hay posibilidad de que haya un grupo vacío (los grupos se derivaron del contenido de la colección)Use,
Distinct()
pero tenga en cuenta que usa el comparador de igualdad predeterminado para comparar valores, por lo que si desea algo más allá de eso, debe implementar su propio comparador.Consulte http://msdn.microsoft.com/en-us/library/bb348436.aspx para ver un ejemplo.
fuente
Aquí tiene tres opciones para eliminar elementos duplicados de su lista:
Distinct(new DistinctItemComparer())
como mencionó @Christian Hayter .Utilizar
GroupBy
, pero tenga en cuentaGroupBy
que debe Agrupar por todas las columnas porque si solo agrupa porId
él no siempre elimina los elementos duplicados. Por ejemplo, considere el siguiente ejemplo:El resultado para esta agrupación será:
Lo cual es incorrecto porque se considera
{Id = 3, Name = "Item3", Code = "IT00004", Price = 250}
duplicado. Entonces la consulta correcta sería:3. Anular
Equal
yGetHashCode
en la clase de elemento:Entonces puedes usarlo así:
fuente
Un método de extensión universal:
Ejemplo de uso:
fuente
Prueba este método de extensión. Espero que esto pueda ayudar.
Uso:
fuente
fuente
Otra solución alternativa, no hermosa compra viable.
Tengo un archivo XML con un elemento llamado "MEMDES" con dos atributos como "GRADE" y "SPD" para registrar la información del módulo RAM. Hay muchos artículos duplicados en SPD.
Así que aquí está el código que uso para eliminar los elementos duplicados:
fuente
Cuando no desee escribir IEqualityComparer, puede intentar algo como lo siguiente.
fuente