2011-05-25 25 views
14

quiero hacer lo opuesto como hereCómo eliminar los no duplicados de una lista en C#

Tengo una lista y sé cómo eliminar los duplicados. Pero quiero tener una opción donde el usuario pueda seleccionar qué duplicado conservar. Algunas consultas quere Puedo tener una lista que solo mostrará los duplicados. Algo así como:

permite decir mi lista es:

"tom" "bob" "Frank" "bob" "Lacey" "Frank"

sé que si uso el método distinto voy a conseguir:

"tom" "bob" "Frank" "Lacey"

No sé qué método que tiene que utilizar para obtener:

"bob" "bob" "franco" "franco"

o para obtener

" bob "" franco "

porque esos son los que se repiten.

+4

Grupo por Nombre tener recuento> 1 –

+0

en otras palabras que quiero hacer lo mismo que iTunes hace cuando se hace clic en la opción que dice la demostración canciones duplicadas. –

+0

@Joe: su respuesta coincide perfectamente con la pregunta. ¿Por qué no lo publica como una respuesta para permitir que el OP lo apruebe? – Sylverdrag

Respuesta

20

Puede utilizar GroupBy para filtrar los artículos que sólo se producen una vez, luego aplanar los productos que queden de nuevo en una lista:

var resultList = list.GroupBy(x => x) 
        .Where(g => g.Count() > 1) 
        .SelectMany(g => g) 
        .ToList(); 
+2

Además, un poco más eficiente para el caso general de un IEnumerable cuando tiene una gran cantidad de duplicados puede usar '.Where (g => g.Skip (1) .Any()) 'en lugar de la condición' Where' anterior. – BrokenGlass

+0

¿Por qué necesitamos SelectMany después de la condición Where? Soy nuevo en Linq por favor ayúdenme a entender esto. – Sandeep

+0

@Sandeep: SelectMany "aplana" una lista de listas a una única lista que consta de todos los elementos que figuran en las listas originales – BrokenGlass

1

que necesitaba para compararlos por una hasta entonces propiedad específica que acaba de modificar su consulta BrokenGlass a

var resultList = itemsThatNeedToBeAdded.GroupBy(x => x.property1) 
        .Where(g => g.Count() > 1) 
        .SelectMany(g => g) 
        .ToList(); 
Cuestiones relacionadas