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:
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) { ... }
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:
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 }) ); }
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!