首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一个好的LINQ方法来做笛卡尔乘积?

有没有一个好的LINQ方法来做笛卡尔乘积?
EN

Stack Overflow用户
提问于 2010-11-02 06:43:15
回答 2查看 29.9K关注 0票数 64

我有一个这样的类结构:

代码语言:javascript
复制
Person
Dogs (dog 1, dog 2, etc)
Puppies (puppy A, puppy B, etc)

只有一个人。他有1..n条狗。每只狗有1..n只小狗。

我想要一张所有可能的小狗组合的清单,从每只狗身上取一只小狗。例如:

狗1小狗A,狗2小狗A狗1小狗A,狗2小狗B狗1小狗B,狗2小狗A狗1小狗B,狗2小狗B

如果是在sql表中,我会执行类似如下的操作来‘乘’这些表:

代码语言:javascript
复制
select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'

有没有类似linq的方式来做这件事?

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-02 07:00:00

如果我理解这个问题,你想要n组小狗的笛卡尔乘积。

如果在编译时知道有多少个集合,就很容易获得笛卡尔乘积:

代码语言:javascript
复制
from p1 in dog1.Puppies
from p2 in dog2.Puppies
from p3 in dog3.Puppies
select new {p1, p2, p3};

假设dog1有小狗p11,p12,dog2有小狗p21,dog3有小狗p31,p32。这将为您提供

代码语言:javascript
复制
{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}

其中每一行都是匿名类型。如果您在编译时不知道有多少个集合,您可以稍微多做一些工作。请看我关于这个主题的文章:

http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

还有这个StackOverflow问题:

Generating all Possible Combinations

一旦你有了CartesianProduct<T>方法,你就可以说

代码语言:javascript
复制
CartesianProduct(from dog in person.Dogs select dog.Puppies)

要获得

代码语言:javascript
复制
{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}

每一行都是一系列的小狗。

讲得通?

票数 95
EN

Stack Overflow用户

发布于 2010-11-02 06:51:37

如果你想要所有可能的狗和小狗的组合,你可以做一个交叉连接:

代码语言:javascript
复制
from dog in Dogs
from puppy in Puppies
select new
{
    Dog = dog,
    Puppy = puppy
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4073713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档