使用 LINQ 生成小狗集的笛卡尔积
LINQ 提供了一个优雅的解决方案来创建笛卡尔积,镜像 SQL 的功能。 让我们用一个涉及人、他们的狗以及每只狗所生的小狗的场景来说明这一点。 目标是生成所有可能的小狗组合,从一个人拥有的每只狗中选择一只小狗。
已知组数
如果狗组(以及小狗组)的数量是预先确定的,则简单的 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>
此查询生成小狗的所有组合,dog1
、dog2
和 dog3
各一个。
未知组数
处理未知数量的狗组需要更灵活的方法:
CartesianProduct<T>
方法: 创建了一个递归方法 CartesianProduct<T>
。此方法接受代表小狗集合的 IEnumerable<T>
序列。
递归实现: CartesianProduct<T>
方法从输入序列递归生成所有可能的组合。
使用该方法,可以简洁地得到笛卡尔积:
<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>
这一行生成所有可能的小狗组合,确保从属于该人的每只狗中选择一只小狗。
这种基于 LINQ 的方法利用集合运算和递归,无论输入集有多少,都可以有效生成笛卡尔积,从而提供强大且适应性强的解决方案。
以上是如何使用 LINQ 高效生成 Puppy 集的笛卡尔积?的详细内容。更多信息请关注PHP中文网其他相关文章!