Est-il un bon LINQ moyen de faire un produit cartésien?
J'ai une structure de classe de la sorte:
Person
Dogs (dog 1, dog 2, etc)
Puppies (puppy A, puppy B, etc)
Il y a une personne. Il a 1..n les chiens. Chaque chien a 1..n chiots.
Je veux une liste de toutes les combinaisons possibles de chiots, la prise de 1 chiot de chaque chien. Par exemple:
chien 1 chiot, chien 2 chiot
chien 1 chiot, chien 2 chiot B
chien 1 chiot B, chien 2 chiot
chien 1 chiot B, chiens 2 chiots B
Si elle était dans les tables sql, je ferais quelque chose comme la suite de "multiplier" les tables:
select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'
Est-il une linq-ish façon de faire ce genre de chose???
Merci beaucoup
Vous devez vous connecter pour publier un commentaire.
Si je comprends bien la question, vous voulez le Produit Cartésien de n ensembles de chiots.
Il est facile d'obtenir le Produit Cartésien si vous savez au moment de la compilation combien de jeux il y a:
Supposons que dog1 a chiots p11, p12, dog2 a chiot p21, et dog3 a chiots p31, p32. Cela vous donne
Où chaque ligne est un type anonyme. Si vous ne connaissez pas, au moment de la compilation, le nombre de jeux il y a, vous pouvez le faire avec un peu plus de travail. Voir mon article sur le sujet:
http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/
et ce StackOverflow question:
Générer toutes les Combinaisons Possibles
Une fois que vous avez la méthode
CartesianProduct<T>
alors vous pouvez direpour obtenir
Où chaque ligne est une séquence de chiots.
Sens?
chiens.Join(chiots, () => true, () => true, (un, deux) => nouveau Tuple(un, deux));
Vous pouvez faire un régulier de la rejoindre, mais les sélecteurs sont tous deux de retour de la même valeur, parce que je veux toutes les combinaisons pour être valide. Lors de la combinaison, mettre les deux en un n-uplet (ou une autre structure de données de votre choix).Ceci devrait faire un produit Cartésien.
Si vous voulez toutes les combinaisons possibles de chien et de chiot, vous voulez faire une jointure croisée: