Kartesisches Produkt in LINQ
Im Bereich der Datenverarbeitung ist das kartesische Produkt eine grundlegende Operation, die Elemente aus mehreren Mengen kombiniert, um neue Kombinationen zu erstellen. In diesem Artikel wird ein LINQ-basierter Ansatz zur Implementierung kartesischer Produkte untersucht, insbesondere für Situationen, in denen die Anzahl der Sammlungen zur Kompilierungszeit unbekannt ist.
Das kartesische Produkt verstehen
Einfach ausgedrückt kombiniert das kartesische Produkt jedes Element in einem Satz mit jedem Element im anderen Satz und erzeugt so alle möglichen Paarungen. Betrachten Sie eine Gruppe von Menschen {p1, p2, p3} und eine Gruppe von Hunden {d1, d2, d3}. Das kartesische Produkt dieser beiden Mengen ist:
<code>{(p1, d1), (p1, d2), (p1, d3), (p2, d1), (p2, d2), (p2, d3), (p3, d1), (p3, d2), (p3, d3)}</code>
LINQ-Implementierung
Um ein kartesisches Produkt in LINQ durchzuführen, können wir den SelectMany-Operator verwenden. Wenn jedoch die Anzahl der Sammlungen zur Kompilierungszeit unbekannt ist, benötigen wir einen flexibleren Ansatz. Hier kommt die CartesianProduct-Methode ins Spiel:
<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>
Beispielverwendung
Betrachten Sie unser vorheriges Beispiel einer Person mit drei Hunden, von denen jeder eine unterschiedliche Anzahl an Welpen hat:
<code>Person person = ...; var puppyCombinations = CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>
Dieser Code generiert alle möglichen Kombinationen von Welpen für jeden Hund, ähnlich der in der Frage erwähnten SQL-Abfrage:
<code>{(puppyA, puppyA), (puppyA, puppyB), (puppyB, puppyA), (puppyB, puppyB)}</code>
Fazit
Durch die Verwendung der CartesianProduct-Methode können wir kartesische Produkte in LINQ flexibel und effizient berechnen, selbst wenn die Anzahl der Sammlungen zum Zeitpunkt der Kompilierung unbekannt ist. Dadurch eröffnen sich Möglichkeiten für vielfältige Datenverarbeitungs- und Kombinationsaufgaben.
Das obige ist der detaillierte Inhalt vonWie kann man kartesische Produkte in LINQ mit einer unbekannten Anzahl von Sätzen effizient berechnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!