IEnumerable<T>
オブジェクトグラフの複数のレベルで結果をフィルタリングしようとしている場合、これを行うための拡張メソッドをチェーンするのが好ましい方法はありますか?拡張メソッドのIEnumerable <T>をチェーン化するための好ましい(実行可能で可読な)方法は何ですか?
私は任意の拡張メソッドとラムダの使用法を公開していますが、残りのコードベースとの一貫性を保つためにLINQ構文を使用しないことをお勧めします。
SelectMany()
メソッドのselector
にフィルタリングをプッシュするか、別の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; }
}
可読性はほぼ同じです。パフォーマンスは、これがオブジェクトのlinqか他のもののlinqかによって異なります。なぜあなたはそれを測定して見ないのですか? – phoog
はいつも 'libraries => books => chapters'の形式であなたの問い合わせです - あるいはもっと複雑な関係を持つことができます(これは単なるテストモデルです) – NSGaga
@NSGagaそれらは常にその階層形式です。読者が理解しやすくするためのテストモデルに過ぎないということは間違いありません。技術的には、EDI(ANSI X12)構造、ファイル、ISA、GS、STセグメントを扱っています。 –