Heim >Datenbank >MySQL-Tutorial >Wie kann LINQ ein kartesisches Produkt mit einer variablen Anzahl von Sätzen ausführen?

Wie kann LINQ ein kartesisches Produkt mit einer variablen Anzahl von Sätzen ausführen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-17 07:07:12524Durchsuche

How Can LINQ Perform a Cartesian Product with a Variable Number of Sets?

Implementierung eines kartesischen Produkts mit variabler Anzahl von Sätzen mithilfe von LINQ

Angenommen, eine Klassenstruktur enthält eine Person, mehrere Hunde und mehrere Welpen für jeden Hund. Ziel ist es, eine Liste aller möglichen Welpenkombinationen zu erstellen und aus jedem Hund einen Welpen auszuwählen.

In SQL kann dies mithilfe der kartesischen Produktoperation erreicht werden, zum Beispiel:

<code class="language-sql">select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'</code>

Ist es möglich, ähnliche Vorgänge mit LINQ durchzuführen?

Wenn die festgelegte Größe der Hunde (d. h. die Anzahl der Hunde) zum Zeitpunkt der Kompilierung bekannt ist, kann ein einfacher Ansatz verwendet werden:

<code class="language-csharp">from p1 in dog1.Puppies
from p2 in dog2.Puppies
from p3 in dog3.Puppies
select new {p1, p2, p3};</code>

Wenn jedoch die Anzahl der gesammelten Hunde unbekannt ist, ist ein allgemeinerer Ansatz erforderlich. Eric Lippert beschreibt in seinem Artikel und auf StackOverflow eine Lösung, die die Erstellung einer benutzerdefinierten Methode zur Berechnung des kartesischen Produkts umfasst:

<code class="language-csharp">public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sets) {
    // ... implementation omitted for brevity
}</code>

Mit dieser Methode kann die gewünschte Abfrage wie folgt ausgedrückt werden:

<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies)</code>

Dadurch wird eine Folge von Welpensequenzen zurückgegeben, wobei jede Sequenz eine Kombination aus einem Welpen jedes Hundes darstellt. Wenn beispielsweise die Hunde „Hund1“ und „Hund2“ die Welpen „p11“, „p12“ und „p21“ haben, lautet die Ausgabe:

<code>{p11, p21}
{p11, p22}
{p12, p21}
{p12, p22}</code>

Das obige ist der detaillierte Inhalt vonWie kann LINQ ein kartesisches Produkt mit einer variablen Anzahl von Sätzen ausführen?. 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