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
Freigeben: 2025-01-31 05:36:10
Original
387 Leute haben es durchsucht

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>
Nach dem Login kopieren
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
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 })
    );
}
Nach dem Login kopieren

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:

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);
Nach dem Login kopieren

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!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage