LINQ を使用したマルチレベル オブジェクトの関係からデカルト積を効率的に生成する
オブジェクト指向プログラミングには、多くの場合、複雑なマルチレベルの関係が含まれます。 次の例を考えてみましょう:
<code class="language-csharp">class Person { public List<Dog> Dogs { get; set; } } class Dog { public List<Puppy> Puppies { get; set; } } class Puppy { public string Name { get; set; } }</code>
ここでは、Person
には複数の Dog
があり、各 Dog
には複数の Puppy
があります。 課題は、デカルト積 (各 Puppy
から 1 つの Dog
を選択するすべての可能な組み合わせ) を生成することです。
従来の SQL では結合を使用します。 LINQ は、より洗練されたソリューションを提供します。 固定数の Dog
(コンパイル時に既知) の場合は、単純な LINQ クエリで十分です。
<code class="language-csharp">from p1 in dog1.Puppies from p2 in dog2.Puppies from p3 in dog3.Puppies select new { p1, p2, p3 };</code>
これにより、次のような組み合わせが得られます。
<code>{p11, p21, p31}, {p11, p21, p32}, {p12, p21, p31}, {p12, p21, p32}</code>
ただし、Dog
の数が動的である (コンパイル時に不明) 場合は、より一般化されたアプローチが必要です。 Eric Lippert の記事 (https://www.php.cn/link/f28c49d8be62973ac7716e0b87dae2f9) は、このシナリオに対する堅牢なソリューションを提供します。
適切な CartesianProduct
メソッド (Lippert の記事で説明されているとおり) を使用すると、クエリは次のように単純化されます。
<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>
これでも同じ結果が得られます。 LINQ の表現力により、複雑なマルチレベル オブジェクトの関係を簡潔かつ保守しやすく処理できるため、デカルト積の作成が簡素化されます。
以上がLINQ はマルチレベル オブジェクトの関係からデカルト積を効率的に生成するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。