IT박스

데카르트 곱을 수행하는 좋은 LINQ 방법이 있습니까?

itboxs 2021. 1. 11. 07:53
반응형

데카르트 곱을 수행하는 좋은 LINQ 방법이 있습니까?


다음과 같은 클래스 구조가 있습니다.

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-ish 방법이 있습니까 ???

정말 고마워


내가 질문을 이해한다면, 당신 은 강아지 n 세트의 데카르트 곱을 원합니다 .

컴파일 타임에 몇 개의 집합이 있는지 알면 Cartesian Product를 쉽게 얻을 수 있습니다.

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}

각 행은 일련의 강아지입니다.

말이 되나?


dogs.Join (강아지, () => true, () => true, (one, two) => new Tuple (one, two));

일반 조인을 수행 할 수 있지만 모든 조합이 유효하기를 원하기 때문에 선택기는 모두 동일한 값을 반환합니다. 결합 할 때 둘 다 하나의 튜플 (또는 선택한 다른 데이터 구조)에 넣습니다.

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

이것은 데카르트 곱을해야합니다.


개와 강아지의 가능한 모든 조합을 원하면 교차 조인을 수행합니다.

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

참조 URL : https://stackoverflow.com/questions/4073713/is-there-a-good-linq-way-to-do-a-cartesian-product

반응형