데카르트 제품을 할 수 있는 좋은 LINQ 방법이 있습니까?
저는 다음과 같은 클래스 구조를 가지고 있습니다.
Person
Dogs (dog 1, dog 2, etc)
Puppies (puppy A, puppy B, etc)
한 사람이 있습니다.그는 1..n마리의 개를 가지고 있습니다.각각의 개는 1..n마리의 강아지를 가지고 있습니다.
저는 강아지 한 마리당 강아지 한 마리씩 가능한 모든 강아지들의 조합 목록을 원합니다.예:
강아지 1마리 강아지 A, 강아지 2마리 강아지 A, 강아지 2마리 강아지 B, 강아지 2마리 강아지 A, 강아지 1마리 강아지 B, 강아지 2마리 강아지 B
만약 그것이 sql 테이블에 있다면, 나는 테이블을 '곱하기' 위해 다음과 같은 일을 할 것입니다.
select * from puppies a, puppies b where a.parent='dog1' and b.parent='dog2'
이런 종류의 일을 할 수 있는 린크 같은 방법이 있습니까?
정말 감사합니다.
제가 질문을 이해한다면, 당신은 decartian product of puppies n sets를 원합니다.
컴파일 시 다음과 같은 세트가 몇 개인지 알면 데카르트 제품을 쉽게 얻을 수 있습니다.
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}
여기서 각 행은 일련의 강아지입니다.
이해했어?
개들.조인 (puppies, () => true, () => true, (하나, 둘) => new Tuple (하나, 둘);
정기적으로 조인할 수 있지만 모든 조합이 유효하기를 원하기 때문에 선택기 둘 다 동일한 값을 반환합니다.결합할 때는 둘 다 하나의 튜플(또는 선택한 다른 데이터 구조)에 넣습니다.
leftSide.SelectMany((l) => rightSide, (l, r) => new Tuple(l, r));
이것은 데카르트 제품이어야 합니다.
만약 당신이 가능한 모든 강아지와 강아지의 조합을 원한다면, 당신은 교차 결합을 할 것입니다:
from dog in Dogs
from puppy in Puppies
select new
{
Dog = dog,
Puppy = puppy
}
string[] colors = { "Red", "Green", "Blue" };
string[] sizes = { "Small", "Medium", "Large" };
var result = from color in colors
from size in sizes
select new { Color = color, Size = size };
foreach (var item in result)
{
Console.WriteLine(item);
}
언급URL : https://stackoverflow.com/questions/4073713/is-there-a-good-linq-way-to-do-a-cartesian-product
'programing' 카테고리의 다른 글
피벗 테이블 열 필터링, 다음 경우에만 계산 (0) | 2023.06.09 |
---|---|
리액트 네이티브 iOS 시뮬레이터에서 경고를 숨기는 방법은 무엇입니까? (0) | 2023.06.09 |
과부하 상태에서 스레드 풀 부족 문제 해결 (0) | 2023.06.04 |
[ : 셸 프로그래밍에서 예기치 않은 연산자 (0) | 2023.06.04 |
레일즈에서 플럭과 수집의 차이점은 무엇입니까? (0) | 2023.06.04 |