ホームページ >バックエンド開発 >C++ >セット数が不明な LINQ でデカルト積を効率的に計算するにはどうすればよいですか?

セット数が不明な LINQ でデカルト積を効率的に計算するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-18 08:51:09236ブラウズ

How to Efficiently Compute Cartesian Products in LINQ with an Unknown Number of Sets?

LINQ のデカルト積

データ処理の分野では、デカルト積は、複数のセットの要素を組み合わせて新しい組み合わせを作成する基本的な演算です。この記事では、特にコンパイル時にコレクションの数が不明な状況を対象として、デカルト積を実装するための LINQ ベースのアプローチについて説明します。

デカルト積を理解する

簡単に言うと、デカルト積は、一方のセットのすべての要素ともう一方のセットのすべての要素を組み合わせて、可能なすべてのペアを生成します。人のセット {p1, p2, p3} と犬のセット {d1, d2, d3} について考えてみましょう。これら 2 つのセットのデカルト積は次のようになります:

<code>{(p1, d1), (p1, d2), (p1, d3),
 (p2, d1), (p2, d2), (p2, d3),
 (p3, d1), (p3, d2), (p3, d3)}</code>

LINQ 実装

LINQ でデカルト積を実行するには、SelectMany 演算子を利用できます。ただし、コンパイル時にコレクションの数が不明な場合は、より柔軟なアプローチが必要です。ここで CartesianProduct メソッドが登場します:

<code>public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    // 基本情况:空序列
    if (!sequences.Any())
        return new[] { Enumerable.Empty<T>() };

    // 简化为两个序列
    var first = sequences.First();
    var rest = sequences.Skip(1);

    // 递归计算其余部分的笛卡尔积
    var cartesianProducts = rest.CartesianProduct();

    // 将第一个序列与每个笛卡尔积组合
    return from f in first
           from c in cartesianProducts
           select f.Concat(c);
}</code>

使用例

それぞれに異なる数の子犬を飼っている 3 匹の犬を飼っている人の前の例を考えてみましょう。

<code>Person person = ...;
var puppyCombinations = CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>

このコードは、質問で述べた SQL クエリと同様に、各犬の子犬の可能なすべての組み合わせを生成します。

<code>{(puppyA, puppyA),
 (puppyA, puppyB),
 (puppyB, puppyA),
 (puppyB, puppyB)}</code>

結論

CartesianProduct メソッドを使用すると、コンパイル時にコレクションの数が不明な場合でも、LINQ で柔軟かつ効率的にデカルト積を計算できます。これにより、さまざまなデータ処理や結合タスクの可能性が広がります。

以上がセット数が不明な LINQ でデカルト積を効率的に計算するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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