使用 LINQ 從多層物件關係高效產生笛卡爾積
物件導向的程式設計通常涉及複雜的多層次關係。 考慮這個例子:
<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>
這裡,一個Person
有多個Dog
,每個Dog
有多個Puppy
。 挑戰在於產生笛卡爾積 - 從每個 Puppy
.Dog
中選擇一個
傳統 SQL 將使用連線。 LINQ 提供了更優雅的解決方案。 對於固定數量的 Dog
(在編譯時已知),一個簡單的 LINQ 查詢就足夠了:
<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>
這會產生如下組合:
<code>{p11, p21, p31}, {p11, p21, p32}, {p12, p21, p31}, {p12, p21, p32}</code>
但是,當 Dog
的數量是動態的(編譯時未知)時,需要更通用的方法。 Eric Lippert 的文章 (https://www.php.cn/link/f28c49d8be62973ac7716e0b87dae2f9) 為此情況提供了一個強大的解決方案。
使用適當的 CartesianProduct
方法(如 Lippert 的文章中所述),查詢可以簡化為:
<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>
這達到了相同的結果。 LINQ 的表達能力允許對複雜的多層物件關係進行簡潔且可維護的處理,從而簡化笛卡爾積的創建。
以上是LINQ 如何有效率地從多層物件關係產生笛卡爾積?的詳細內容。更多資訊請關注PHP中文網其他相關文章!