Se sto provando a filtrare i risultati a più livelli di un grafico di oggetti IEnumerable<T>
, c'è un modo preferito di concatenare i metodi di estensione per farlo?Qual è il modo preferito (efficace e leggibile) di concatenare i metodi di estensione IEnumerable <T>?
Sono aperto a qualsiasi metodo di estensione e utilizzo lambda, ma preferirei non utilizzare la sintassi LINQ per rimanere coerente con il resto del codebase.
È meglio spingere il filtro sul metodo selector
del metodo SelectMany()
o semplicemente su un altro metodo di catena Where()
? O c'è una soluzione migliore?
Come scegliere l'opzione migliore? In questo test case, tutto è direttamente disponibile in memoria. Ovviamente entrambi i campioni sottostanti stanno attualmente producendo gli stessi risultati corretti; Sto solo cercando una ragione per cui l'uno o l'altro (o un'altra opzione) sarebbe preferibile.
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();
}
Ed ecco il grafico oggetto del campione:
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 leggibilità sembra uguale. Le prestazioni dipendono dal fatto che si tratti di linq per oggetti o di linq per qualsiasi altra cosa; perché non lo misuri e vedi? – phoog
le tue query sono sempre sotto forma di 'libraries => books => chapters' - oppure potresti avere relazioni più complesse (immagino che questo sia solo un modello di test) – NSGaga
@NSGaga Sono sempre in quella forma gerarchica, ma hai ragione che è solo un modello di test per renderlo più facile da capire per i lettori. Tecnicamente, sto lavorando con strutture EDI (ANSI X12), quindi file, ISA, GS e segmenti ST. –