首頁 >後端開發 >C++ >LINQ 如何有效率地從多層物件關係產生笛卡爾積?

LINQ 如何有效率地從多層物件關係產生笛卡爾積?

Barbara Streisand
Barbara Streisand原創
2025-01-18 08:57:10424瀏覽

How Can LINQ Efficiently Generate Cartesian Products from Multi-Level Object Relationships?

使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn