ホームページ >データベース >mysql チュートリアル >LINQ は、変数セット数を使用してデカルト積をどのように実行できますか?
LINQ を使用した変数セット数のデカルト積の実装
クラス構造に人、複数の犬、各犬に複数の子犬が含まれているとします。目標は、各犬から 1 匹の子犬を選択し、考えられるすべての子犬の組み合わせのリストを生成することです。
SQL では、これはデカルト積演算を使用して実現できます。たとえば、
<code class="language-sql">select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'</code>
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>
ただし、犬の収集頭数が不明な場合は、より一般的なアプローチが必要です。 Eric Lippert は、デカルト積を計算するためのカスタム メソッドを作成することを含む解決策について、彼の記事と StackOverflow で詳しく説明しています。
<code class="language-csharp">public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sets) { // ... implementation omitted for brevity }</code>
このメソッドを使用すると、目的のクエリは次のように表現できます:
<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies)</code>
これは子犬シーケンスのシーケンスを返します。各シーケンスは各犬からの 1 匹の子犬の組み合わせを表します。たとえば、犬「dog1」と「dog2」にそれぞれ子犬「p11」、「p12」、「p21」がいる場合、出力は次のようになります:
<code>{p11, p21} {p11, p22} {p12, p21} {p12, p22}</code>
以上がLINQ は、変数セット数を使用してデカルト積をどのように実行できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。