Effiziente Generierung kartesischer Produkte aus mehrstufigen Objektbeziehungen mit LINQ
Objektorientierte Programmierung beinhaltet oft komplizierte Beziehungen auf mehreren Ebenen. Betrachten Sie dieses Beispiel:
<code class="language-csharp">class Person { public List<Dog> Dogs { get; set; } } class Dog { public List<Puppy> Puppies { get; set; } } class Puppy { public string Name { get; set; } }</code>
Hier hat ein Person
mehrere Dog
s, und jedes Dog
hat mehrere Puppy
s. Die Herausforderung besteht darin, das kartesische Produkt zu generieren – alle möglichen Kombinationen aus der Auswahl eines Puppy
aus jedem Dog
.
Traditionelles SQL würde Joins verwenden. LINQ bietet eine elegantere Lösung. Für eine feste Anzahl von Dog
s (zur Kompilierzeit bekannt) reicht eine einfache LINQ-Abfrage aus:
<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>
Dies ergibt Kombinationen wie:
<code>{p11, p21, p31}, {p11, p21, p32}, {p12, p21, p31}, {p12, p21, p32}</code>
Wenn jedoch die Anzahl der Dog
s dynamisch ist (zum Zeitpunkt der Kompilierung unbekannt), ist ein allgemeinerer Ansatz erforderlich. Der Artikel von Eric Lippert (https://www.php.cn/link/f28c49d8be62973ac7716e0b87dae2f9) bietet eine solide Lösung für dieses Szenario.
Mit einer geeigneten CartesianProduct
-Methode (wie in Lipperts Artikel beschrieben) vereinfacht sich die Abfrage zu:
<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>
Dadurch wird das gleiche Ergebnis erzielt. Die Ausdruckskraft von LINQ ermöglicht eine präzise und wartbare Handhabung komplexer mehrstufiger Objektbeziehungen und vereinfacht die Erstellung kartesischer Produkte.
Das obige ist der detaillierte Inhalt vonWie kann LINQ effizient kartesische Produkte aus mehrstufigen Objektbeziehungen generieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!