Heim >Backend-Entwicklung >C++ >Wie generiere ich alle möglichen Kombinationen von Array -Elementen mit dem kartesischen Produkt von Linq?

Wie generiere ich alle möglichen Kombinationen von Array -Elementen mit dem kartesischen Produkt von Linq?

Barbara Streisand
Barbara StreisandOriginal
2025-01-31 05:36:10389Durchsuche

How to Generate All Possible Combinations of Array Elements Using LINQ's Cartesian Product?

Verwenden Sie LINQ, um eine Vielzahl von Kombinationen zu generieren

Geben Sie zwei Array, Array1 und Array2 an. Zum Beispiel gegeben:

array1: {a, b, c}

    Array2: {3, 2, 4}
  • Wir möchten die folgende Kombination generieren:

Dieser Prozess erfordert, dass wir das Fragment der Sequenz dieser beiden Arrays erhalten. LINQ bietet eine direkte Möglichkeit, diese Descartes zu generieren:

<code>    a1 b1 c1
    a1 b1 c2
    a1 b1 c3
    a1 b1 c4

    a1 b2 c1
    a1 b2 c2
    a1 b2 c3
    a1 b2 c4


    a2 b1 c1
    a2 b1 c2
    a2 b1 c3
    a2 b1 c4

    a2 b2 c1
    a2 b2 c2
    a2 b2 c3
    a2 b2 c4


    a3 b1 c1
    a3 b1 c2
    a3 b1 c3
    a3 b1 c4

    a3 b2 c1
    a3 b2 c2
    a3 b2 c3
    a3 b2 c4 (最后一行)</code>
Erstellen Sie Descartes

Diese Methode erhält die Sequenz der Sequenz und verwendet den Aggregatoperator, um die Descartes -Akkumulation zu akkumulieren. Es beginnt mit einer leeren Sequenz als Cumulator und kombiniert sie wiederholt mit jeder Sequenz in der Eingangssequenz. Für jede Kombination komprimiert es die Elemente im Cumulator und die Elemente in der Stromsequenz, um die Hydrochllar -Akkumulation zu erzeugen.

komprimierte Daten
<code class="language-csharp">static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
            from accseq in accumulator
            from item in sequence
            select accseq.Concat(new[] { item })
    );
}</code>

Sobald wir die Akkumulation von Descartes haben, können wir die Elemente im ersten Array und das entsprechende Element im zweiten Array des zweiten Arrays komprimieren:

Mit cartesianProduct -Methode können wir die Descartes mehrerer Sequenzen leicht erzeugen. Wir erstellen eine Sequenz einer Sequenz, indem wir für jedes Element im zweiten Array einen Ganzzahlbereich erzeugen, und dann diese Descartes -Bereich mit dem ersten Array komprimieren, um die erforderliche Kombination zu erstellen.

Schließlich können wir die Sequenz der Sequenz der Sequenz durchqueren und jede Zeile drucken:

<code class="language-csharp">var arr1 = new[] { "a", "b", "c" };
var arr2 = new[] { 3, 2, 4 };
var result = from cpLine in CartesianProduct(
                 from count in arr2 select Enumerable.Range(1, count))
             select cpLine.Zip(arr1, (x1, x2) => x2 + x1);</code>

Dieser Code generiert eine Kombination als Zeichenfolge und druckt sie in die Konsole.

Das obige ist der detaillierte Inhalt vonWie generiere ich alle möglichen Kombinationen von Array -Elementen mit dem kartesischen Produkt von Linq?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn