使用LINQ实现具有可变数量集合的笛卡尔积
假设一个类结构包含一个人、多条狗以及每条狗的多只小狗。目标是生成所有可能的小狗组合列表,从每条狗中选择一只小狗。
在SQL中,可以使用笛卡尔积运算来实现这一点,例如:
<code class="language-sql">select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'</code>
可以使用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>
但是,如果狗的集合数量未知,则需要一种更通用的方法。Eric Lippert在他的文章和StackOverflow中详细描述了一种解决方案,该解决方案涉及创建一个自定义方法来计算笛卡尔积:
<code class="language-csharp">public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sets) { // ... implementation omitted for brevity }</code>
使用此方法,可以将所需的查询表示为:
<code class="language-csharp">CartesianProduct(from dog in person.Dogs select dog.Puppies)</code>
这将返回一系列小狗序列,其中每个序列代表来自每条狗的一只小狗的组合。例如,如果狗'dog1'和'dog2'分别拥有小狗'p11'、'p12'和'p21',则输出将为:
<code>{p11, p21} {p11, p22} {p12, p21} {p12, p22}</code>
以上是LINQ 如何执行具有可变数量集合的笛卡尔积?的详细内容。更多信息请关注PHP中文网其他相关文章!