有没有好的 LINQ 方法来计算笛卡尔积?

2024-04-26

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

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 的方法来做这种事情???

非常感谢


如果我理解这个问题,你想要笛卡尔积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/ http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

还有这个 StackOverflow 问题:

生成所有可能的组合 https://stackoverflow.com/questions/3093622

一旦你掌握了方法CartesianProduct<T>那么你可以说

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

to get

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

每行都是一系列小狗。

合理?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有好的 LINQ 方法来计算笛卡尔积? 的相关文章

随机推荐