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
.