Si tengo la variable del tipo IEnumerable<List<string>>
¿hay una declaración LINQ o una expresión lambda que pueda aplicarle y que combine las listas devolviendo un IEnumerable<string>
?Combinación de listas en Lambda/LINQ
Respuesta
SelectMany - es decir
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
para cada elemento de algunalista, este utiliza entonces la lambda "x => x" para obtener un IEnumerable <T> para los elementos interiores. 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.
No es exactamente una sola llamada a un método, pero debe ser capaz de escribir
var concatenated = from list in lists from item in list select item;
Donde 'listas' es su IEnumerable<List<string>>
y concatenada es de tipo IEnumerable<string>
.
(Técnicamente esto es una sola llamada a un método para SelectMany
-. Simplemente no parece que era todo lo que quería decir con la declaración de apertura Sólo quería aclarar eso en caso de que alguien se confundió o comentó - me di cuenta después de haber publicado cómo podría haberlo leído).
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;
}
}
El uso de la expresión LINQ ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
... funciona muy bien. :-)
b
será un IEnumerable<string>
y a
será un string
.
Aquí hay otra comprensión de consultas LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;
¿Qué tal
myStrings.SelectMany(x => x)
buena solución, con pequeño error tipográfico –
Gracias. Actualizado el error tipográfico – JaredPar
- 1. Combinación de diccionarios de listas en Python
- 2. Combinación de dos listas en scala
- 3. Combinación de listas de datos de frecuencia de palabra
- 4. Combinación del inicializador de listas y el inicializador de objetos
- 5. Erlang: ¿qué combinación de patrones es más eficiente (listas)?
- 6. Listas de listas de listas
- 7. Combinación de fusiones en una sola combinación
- 8. Combinación de dos listas y eliminación de duplicados, sin eliminar duplicados en la lista original
- 9. Búsqueda de Python en listas de listas
- 10. Linq - operando en listas de listas
- 11. SQL combinación izquierda (múltiple condición de combinación)
- 12. Plugin JQuery - Ordenar listas anidadas entre dos listas
- 13. Combinación de predicados en F #
- 14. Generador de combinación en Linq
- 15. Combinación de prefijos en SSE
- 16. Combinación de registros en vim
- 17. Combinación de artefactos en TeamCity
- 18. Combinación manual en GIT
- 19. do.call en combinación con "::"
- 20. * combinación * Right * en LINQ
- 21. Crear listas de listas de manera pitónica
- 22. Comprensión de lista: hacer listas de listas
- 23. Reordenar listas como listas de reproducción en el reproductor multimedia
- 24. de combinación aleatoria especie
- 25. Combinación de entradas
- 26. compleja consulta de combinación
- 27. ¿Combinación de filtros RSpec?
- 28. Hash de combinación/concatenación
- 29. documentos de combinación
- 30. vb.net combinación de teclas
y no hay razón para no usarlo si está utilizando .NET 3.5 (que podemos asumir desde el OP), o C# 3.0 con .NET 2.0 y LinqBridge. –
@Marc: tienes razón, especialmente si hay una manera fácil de "linqish". A veces las personas simplemente se esfuerzan por hacer algo de la manera LINQ y hacen que las cosas simples sean más difíciles de entender. – VVS