首页 >后端开发 >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