objetos listas comparar c# .net linq lambda

listas - c# linq find duplicates



CombinaciĆ³n de listas en Lambda/LINQ (6)

Aquí hay otra comprensión de consultas LINQ.

IEnumerable<string> myStrings = from a in mySource from b in a select b;

Si tengo una variable de tipo IEnumerable<List<string>> ¿hay una declaración LINQ o una expresión lambda que pueda aplicarle, que combinará las listas devolviendo un IEnumerable<string> ?


Haz un método simple. No hay necesidad de LINQ:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists) { foreach (List<string> list in lists) foreach (string item in list) { yield return item; } }


No es exactamente una llamada a un solo método, pero debería poder escribir

var concatenated = from list in lists from item in list select item;

Donde ''lists'' es su IEnumerable<List<string>> y concatenado es de tipo IEnumerable<string> .

(Técnicamente esta es una llamada de método único a SelectMany , simplemente no parece que fuera todo lo que quise decir con la declaración de apertura. Solo quería aclarar eso en caso de que alguien se confundiera o comenzara, me di cuenta después de que había publicado cómo podría haber leído).


Qué tal si

myStrings.SelectMany(x => x)


SelectMany - es decir

IEnumerable<List<string>> someList = ...; IEnumerable<string> all = someList.SelectMany(x => x);

Para cada elemento en alguna Lista, esto utiliza la lambda "x => x" para obtener un IEnumerable <T> para los elementos internos. En este caso, cada "x" es una Lista <T>, que ya es IEnumerable <T>.

Estos se devuelven como un bloque contiguo. Esencialmente, SelectMany es algo así como (simplificado):

static IEnumerable<TResult> SelectMany<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector) { foreach(TSource item in source) { foreach(TResult result in selector(item)) { yield return result; } } }

Aunque eso se simplifica un tanto.


Usando la expresión LINQ ...

IEnumerable<string> myList = from a in (from b in myBigList select b) select a;

... funciona bien :-)

b será una IEnumerable<string> y a será una string .