ホームページ >データベース >mysql チュートリアル >LINQ は、変数セット数を使用してデカルト積をどのように実行できますか?

LINQ は、変数セット数を使用してデカルト積をどのように実行できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-17 07:07:12524ブラウズ

How Can LINQ Perform a Cartesian Product with a Variable Number of Sets?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。