programing

데카르트 제품을 할 수 있는 좋은 LINQ 방법이 있습니까?

telecom 2023. 6. 9. 21:45
반응형

데카르트 제품을 할 수 있는 좋은 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

반응형