Chr*_*ris 56 c# sql linq asp.net cartesian-product
我有这样的类结构:
Person
Dogs (dog 1, dog 2, etc)
Puppies (puppy A, puppy B, etc)
Run Code Online (Sandbox Code Playgroud)
有一个人.他有1只狗.每只狗有1只小狗.
我想列出所有可能的小狗组合,从每只狗中取一只小狗.例如:
狗1小狗A,狗2小狗狗1小狗A,狗2小狗B狗1小狗B,狗2小狗狗1小狗B,小狗2小狗B
如果它是在sql表中,我会做类似以下的事情来"乘以"表:
select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'
Run Code Online (Sandbox Code Playgroud)
是否有一些linq-ish方式来做这种事情???
非常感谢
Eri*_*ert 85
如果我理解这个问题,你需要n套小狗的笛卡尔积.
如果您在编译时知道有多少集合,那么很容易获得笛卡尔积:
from p1 in dog1.Puppies
from p2 in dog2.Puppies
from p3 in dog3.Puppies
select new {p1, p2, p3};
Run Code Online (Sandbox Code Playgroud)
假设dog1有小狗p11,p12,dog2有小狗p21,dog3有小狗p31,p32.这给了你
{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}
Run Code Online (Sandbox Code Playgroud)
每行是匿名类型.如果您在编译时不知道有多少集,那么您可以稍微多做一些工作.看我关于这个主题的文章:
http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/
这个StackOverflow问题:
一旦你有了这个方法,CartesianProduct<T>你就可以说
CartesianProduct(from dog in person.Dogs select dog.Puppies)
Run Code Online (Sandbox Code Playgroud)
要得到
{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}
Run Code Online (Sandbox Code Playgroud)
每排是一系列小狗.
合理?
McK*_*Kay 18
dogs.Join(puppies,()=> true,()=> true,(one,two)=> new Tuple(one,two));
您可以进行常规连接,但选择器都返回相同的值,因为我希望所有组合都有效.组合时,将两者放入一个元组(或您选择的不同数据结构).
leftSide.SelectMany((l) => rightSide, (l, r) => new Tuple(l, r));
Run Code Online (Sandbox Code Playgroud)
这应该是笛卡尔积.
And*_*tad 14
如果你想要狗和小狗的所有可能的组合,你会做一个交叉连接:
from dog in Dogs
from puppy in Puppies
select new
{
Dog = dog,
Puppy = puppy
}
Run Code Online (Sandbox Code Playgroud)