Если я пытаюсь отфильтровать результаты на нескольких уровнях IEnumerable<T>
графа объектов, есть ли для этого предпочтительный способ объединения методов расширения в цепочку?
Я открыт для любого метода расширения и использования лямбда-выражений, но я бы предпочел не использовать синтаксис LINQ, чтобы оставаться совместимым с остальной кодовой базой.
Лучше перенести фильтрацию на selector
метода SelectMany()
или просто связать другой метод Where()
? Или есть лучшее решение?
Как мне определить наилучший вариант? В этом тестовом примере все доступно непосредственно в памяти. Очевидно, что оба приведенных ниже примера в настоящее время дают одинаковые правильные результаты; Я просто ищу причину, по которой тот или иной (или другой вариант)предпочтительнее.
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();
}
А вот пример графа объекта:
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; }
}