如果我理解这个问题,你想要笛卡尔积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}
每行都是一系列小狗。
合理?