Каков предпочтительный (эффективный и удобочитаемый)способ связывания методов расширения IEnumerable?

Если я пытаюсь отфильтровать результаты на нескольких уровнях 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; }
}
6
задан BQ. 9 April 2012 в 22:37
поделиться