>백엔드 개발 >C++ >세트 수를 알 수 없는 LINQ에서 데카르트 곱을 효율적으로 계산하는 방법은 무엇입니까?

세트 수를 알 수 없는 LINQ에서 데카르트 곱을 효율적으로 계산하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-18 08:51:09236검색

How to Efficiently Compute Cartesian Products in LINQ with an Unknown Number of Sets?

LINQ의 데카르트 곱

데이터 처리 분야에서 데카르트 곱은 여러 세트의 요소를 결합하여 새로운 조합을 만드는 기본 작업입니다. 이 문서에서는 특히 컴파일 타임에 컬렉션 수를 알 수 없는 상황을 위해 데카르트 곱을 구현하는 LINQ 기반 접근 방식을 살펴봅니다.

데카르트곱의 이해

간단히 말하면 데카르트 곱은 한 세트의 모든 요소를 ​​다른 세트의 모든 요소와 결합하여 가능한 모든 쌍을 생성합니다. 사람 집합 {p1, p2, p3}과 개 집합 {d1, d2, d3}을 생각해 보세요. 이 두 세트의 데카르트 곱은 다음과 같습니다.

<code>{(p1, d1), (p1, d2), (p1, d3),
 (p2, d1), (p2, d2), (p2, d3),
 (p3, d1), (p3, d2), (p3, d3)}</code>

LINQ 구현

LINQ에서 데카르트 곱을 수행하기 위해 SelectMany 연산자를 활용할 수 있습니다. 그러나 컴파일 타임에 컬렉션 수를 알 수 없는 경우에는 보다 유연한 접근 방식이 필요합니다. CartesianProduct 메소드가 사용되는 곳은 다음과 같습니다.

<code>public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    // 基本情况:空序列
    if (!sequences.Any())
        return new[] { Enumerable.Empty<T>() };

    // 简化为两个序列
    var first = sequences.First();
    var rest = sequences.Skip(1);

    // 递归计算其余部分的笛卡尔积
    var cartesianProducts = rest.CartesianProduct();

    // 将第一个序列与每个笛卡尔积组合
    return from f in first
           from c in cartesianProducts
           select f.Concat(c);
}</code>

사용예

각각 다른 수의 강아지를 키우는 세 마리의 개를 키우는 사람의 이전 예를 생각해 보세요.

<code>Person person = ...;
var puppyCombinations = CartesianProduct(from dog in person.Dogs select dog.Puppies);</code>

이 코드는 질문에 언급된 SQL 쿼리와 유사하게 각 개에 대해 가능한 모든 강아지 조합을 생성합니다.

<code>{(puppyA, puppyA),
 (puppyA, puppyB),
 (puppyB, puppyA),
 (puppyB, puppyB)}</code>

결론

CartesianProduct 메서드를 사용하면 컴파일 시 컬렉션 수를 알 수 없는 경우에도 LINQ에서 유연하고 효율적으로 데카르트 곱을 계산할 수 있습니다. 이는 다양한 데이터 처리 및 조합 작업에 대한 가능성을 열어줍니다.

위 내용은 세트 수를 알 수 없는 LINQ에서 데카르트 곱을 효율적으로 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.