代码之家  ›  专栏  ›  技术社区  ›  Chris

有没有一个好的LINQ方法来做笛卡尔积?

  •  49
  • Chris  · 技术社区  · 15 年前

    我有一个这样的班级结构:

    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'
    

    有什么方法可以做到这一点吗????

    非常感谢

    3 回复  |  直到 10 年前
        1
  •  75
  •   Community Mohan Dere    9 年前

    from p1 in dog1.Puppies
    from p2 in dog2.Puppies
    from p3 in dog3.Puppies
    select new {p1, p2, p3};
    

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

    http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

    Generating all Possible Combinations

    CartesianProduct<T>

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

        2
  •  16
  •   McKay    15 年前

    leftSide.SelectMany((l) => rightSide, (l, r) => new Tuple(l, r));
    

        3
  •  13
  •   Anders Fjeldstad    15 年前

    from dog in Dogs
    from puppy in Puppies
    select new
    {
        Dog = dog,
        Puppy = puppy
    }