一尘不染

有没有很好的LINQ方式来做笛卡尔积?

c#

我有一个像这样的类结构:

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表中,我将执行以下操作以“乘以”表:

select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'

有某种linq-ish的方式来做这种事情吗???

非常感谢


阅读 290

收藏
2020-05-19

共1个答案

一尘不染

如果我理解这个问题,则需要n组幼犬的 笛卡尔积

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

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。这给你

{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问题:

生成所有可能的组合

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

CartesianProduct(from dog in person.Dogs select dog.Puppies)

要得到

{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}

每行是一系列的幼犬。

合理?

2020-05-19