2011-09-07 19 views
6

Esto no es una pregunta tan complicada, pero no puedo entenderlo en linq.Union A Lista de listas usando Linq

que tienen un Enumerable<T> que contiene un Enumerable<string>:

public class 
{ 
    List<List<string>> ListOfLists = new List<List<string>>(); 
} 

Básicamente quiero volver cada cadena única de ListOfLists; esto es fácil usando un bucle foreach y una variable de almacenamiento (que probablemente podría mejorar la eficiencia de no tener la distinta al final, pero ese no es el punto):

List<string> result = new List<string>(); 

foreach (var v in ListOfLists) 
{ 
    foreach (var s in v) 
    { 
     result.Add(s); 
    } 
} 

result.Distinct(); 

¿Cómo se hace esto con LINQ?

+0

Ya tiene las respuestas. Yo sugeriría probar el método de extensión con este problema. Donde sus métodos de extensión seleccionan SelectMany and Distinct de forma optimizada. –

Respuesta

8
var distinctStrings = ListOfLists.SelectMany(list => list).Distinct(); 
1
var result = ListOfLists.SelectMany(v => v).ToList().Distinct(); 

EDIT: Para un mejor rendimiento, utilice:

var result = ListOfLists.SelectMany(v => v).Distinct(); 

o

var result = ListOfLists.SelectMany(v => v).Distinct().ToList(); 
+0

No es necesario que ToList en el medio – RichK

+0

Y si necesita la ToList, hágalo después del Distintivo en lugar de antes. En este caso, su Distintivo ahora está devolviendo un IEnumerable que puede no ser lo que usted quería. Además, hay un golpe de memoria/perfusión para hacer ToList en toda la lista y luego restringir los resultados a Distinct en lugar de hacer Distinct primero. –

+0

@Jim Wooley - gran sugerencia. Gracias a ti y a RichK por los comentarios. Ya aprendemos – Leons

5

Para completar, la sintaxis de expresión de consulta es a veces más fácil (me parece) a proponer que la invocación correcta de SelectMany. Aquí estaría:

result = (from list in ListOfLists 
      from s in list 
      select s).Distinct().ToList(); 
+0

+1 para la sintaxis de consulta en SelectMany –