데카르트 곱을 수행하는 좋은 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
'IT박스' 카테고리의 다른 글
UncaughtExceptionHandler가 ExecutorService에서 호출되지 않는 이유는 무엇입니까? (0) | 2021.01.11 |
---|---|
JAXB 객체 목록의 직렬화를 JSON으로 사용자 정의하려면 어떻게해야합니까? (0) | 2021.01.11 |
JSF에서 CSRF, XSS 및 SQL 주입 공격 방지 (0) | 2021.01.11 |
utf-8을 사용하는 php substr () 함수는 끝에 표시를 남깁니다. (0) | 2021.01.11 |
UIWebView에서 사용자 지정 글꼴 사용 (0) | 2021.01.11 |