Si estoy tratando de filtrar los resultados en varios niveles de un gráfico de objetos IEnumerable<T>
, ¿hay una forma preferida de encadenar métodos de extensión para hacer esto?¿Cuál es la forma preferida (rendimiento y legibilidad) de encadenar los métodos de extensión IEnumerable <T>?
Estoy abierto a cualquier método de extensión y uso de lambda, pero prefiero no usar la sintaxis LINQ para mantener la coherencia con el resto de la base de código.
¿Es mejor empujar el filtrado al selector
del método SelectMany()
o simplemente para encadenar otro método Where()
? ¿O hay una mejor solución?
¿Cómo podría identificar la mejor opción? En este caso de prueba, todo está directamente disponible en la memoria. Obviamente, ambas muestras a continuación están produciendo los mismos resultados correctos; Solo busco una razón por la que una u otra (u otra opción) sería preferible.
public class Test
{
// I want the first chapter of a book that's exactly 42 pages, written by
// an author whose name is Adams, from a library in London.
public Chapter TestingIEnumerableTExtensionMethods()
{
List<Library> libraries = GetLibraries();
Chapter chapter = libraries
.Where(lib => lib.City == "London")
.SelectMany(lib => lib.Books)
.Where(b => b.Author == "Adams")
.SelectMany(b => b.Chapters)
.First(c => c.NumberOfPages == 42);
Chapter chapter2 = libraries
.Where(lib => lib.City == "London")
.SelectMany(lib => lib.Books.Where(b => b.Author == "Adams"))
.SelectMany(b => b.Chapters.Where(c => c.NumberOfPages == 42))
.First();
}
Y aquí está el gráfico de objetos de muestra:
public class Library
{
public string Name { get; set; }
public string City { get; set; }
public List<Book> Books { get; set; }
}
public class Book
{
public string Name { get; set; }
public string Author { get; set; }
public List<Chapter> Chapters { get; set; }
}
public class Chapter
{
public string Name { get; set; }
public int NumberOfPages { get; set; }
}
La legibilidad parece ser casi igual. El rendimiento depende de si esto es linq para los objetos o linq para cualquier otra cosa; ¿Por qué no lo mides y ves? – phoog
son sus consultas siempre en forma de 'libraries => books => capters' - o podría tener relaciones más complejas (supongo que esto es solo un modelo de prueba) – NSGaga
@NSGaga Siempre están en esa forma jerárquica, pero tiene razón en que es solo un modelo de prueba para que los lectores lo entiendan mejor. Técnicamente, estoy trabajando con estructuras EDI (ANSI X12), por lo que los archivos, ISA, GS y segmentos ST. –