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