Heim >Backend-Entwicklung >C++ >Wie kann LINQ verwendet werden, um alle möglichen Kombinationen aus mehreren Arrays mit dem kartesischen Produkt zu generieren?

Wie kann LINQ verwendet werden, um alle möglichen Kombinationen aus mehreren Arrays mit dem kartesischen Produkt zu generieren?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-31 05:31:13601Durchsuche

How Can LINQ Be Used to Generate All Possible Combinations from Multiple Arrays Using the Cartesian Product?

Verwenden Sie LINQ, um alle möglichen Kombinationen aus mehreren Arrays zu generieren: den kartesischen Produktansatz

Dieser Artikel zeigt, wie LINQ (Language Integrated Query) nutzt, um alle möglichen Kombinationen aus mehreren Arrays mit dem kartesischen Produkt effizient zu generieren. Das gewünschte Ausgangsformat ist eine String -Darstellung nach dem Muster a(i) b(j) c(k) n(p), wobei i, j, k und p Indizes innerhalb der definierten Bereiche für jedes Array sind.

Verständnis des kartesischen Produkts

Das kartesische Produkt ist ein grundlegendes mathematisches Konzept. Die angegebenen Mengen A und B sind das kartesische Produkt A X B die Menge aller geordneten Paare (a, b), wobei 'A' zu A gehört und 'B' gehört. Dies erstreckt sich auf mehrere Sätze.

Zum Beispiel, wenn a = {a, b} und b = {1, 2}, dann a x b = {(a, 1), (a, 2), (b, 1), (b, 2)}.

linq Implementierung

Der folgende Linq -Code generiert die gewünschten Kombinationen:

<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);

// Helper function (implementation below)
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(params IEnumerable<IEnumerable<T>>[] sequences) { ... } </code>

Dieser Code verwendet eine CartesianProduct -Helferfunktion (unten detailliert), um das kartesische Produkt von Sequenzen zu berechnen, die aus arr2 erzeugt wurden. Jedes Element in arr2 definiert den Bereich der Indizes für ein entsprechendes Element in arr1. Die Zip -Methode kombiniert dann die Ergebnisse mit arr1, um die endgültigen Ausgangszeichenfolge zu erstellen.

Die CartesianProduct Helferfunktion

Hier ist eine mögliche Implementierung der CartesianProduct -Funktion:

<code class="language-csharp">public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(params IEnumerable<IEnumerable<T>>[] sequences)
{
    if (sequences == null)
        throw new ArgumentNullException(nameof(sequences));

    IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };

    return sequences.Aggregate(
        emptyProduct,
        (accumulator, sequence) =>
            from acc in accumulator
            from item in sequence
            select acc.Concat(new[] { item })
    );
}</code>

Diese Funktion berät das kartesische Produkt einer willkürlichen Anzahl von Eingangssequenzen rekursiv.

Beispielausgabe

Der Code erzeugt bei der Ausführung die folgende Ausgabe und demonstriert alle möglichen Kombinationen:

<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>

Dies zeigt effektiv die Leistung von Linq, um alle möglichen Kombinationen aus mehreren Arrays präzise und elegant zu erzeugen.

Das obige ist der detaillierte Inhalt vonWie kann LINQ verwendet werden, um alle möglichen Kombinationen aus mehreren Arrays mit dem kartesischen Produkt zu generieren?. 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