Если я понимаю вопрос, вы хотите декартово произведение из 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:
Генерация всех возможных комбинаций
Если у вас есть метод CartesianProduct<T>
, вы можете сказать
CartesianProduct(from dog in person.Dogs select dog.Puppies)
чтобы получить
{p11, p21, p31},
{p11, p21, p32},
{p12, p21, p31},
{p12, p21, p32}
Где каждый ряд представляет собой последовательность щенков.
Имеет смысл?