我有一个这样的类结构:
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的方式来做这件事?
非常感谢
发布于 2010-11-02 07:00:00
如果我理解这个问题,你想要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问题:
Generating all Possible Combinations
一旦你有了CartesianProduct<T>方法,你就可以说
CartesianProduct(from dog in person.Dogs select dog.Puppies)要获得
{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}每一行都是一系列的小狗。
讲得通?
发布于 2010-11-02 06:51:37
如果你想要所有可能的狗和小狗的组合,你可以做一个交叉连接:
from dog in Dogs
from puppy in Puppies
select new
{
Dog = dog,
Puppy = puppy
}https://stackoverflow.com/questions/4073713
复制相似问题