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; }
}