>백엔드 개발 >C++ >무작위 하위 집합을 얻기 위한 최적의 LINQ 접근 방식은 무엇입니까?

무작위 하위 집합을 얻기 위한 최적의 LINQ 접근 방식은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-31 19:58:16466검색

What's the Optimal LINQ Approach for Getting a Random Subset?

임의 하위 컬렉션 추출을 위한 최적의 LINQ 확장

프로그래밍 세계에서는 주어진 컬렉션에서 무작위 하위 집합을 추출해야 하는 경우가 많습니다. LINQ 매니아라면 이를 달성하기 위한 최적의 방법이 궁금할 것입니다.

한 가지 접근 방식은 Fisher-Yates-Durstenfeld 셔플을 수행하는 .Shuffle() 확장 메서드를 활용하는 것입니다. 이 방법은 컬렉션의 요소 순서를 효과적으로 무작위화하여 무작위 하위 컬렉션을 생성하는 데 이상적인 솔루션입니다.

사용법을 설명하기 위해 N개 항목이 포함된 yourCollection이라는 컬렉션이 있고 다음을 수행하려고 한다고 가정해 보겠습니다. n

var randomItems = yourCollection.Shuffle().Take(n);

이 코드를 먼저 .Shuffle() 메서드를 사용하여 yourCollection의 요소를 섞습니다. 그런 다음 .Take() 메서드를 사용하여 섞인 컬렉션에서 처음 n개 항목을 추출합니다. 결과는 개수 n의 무작위 하위 컬렉션입니다.

다음은 .Shuffle() 확장 메서드를 직접 구현하는 예입니다.

public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
    {
        return source.Shuffle(new Random());
    }

    public static IEnumerable<T> Shuffle<T>(
        this IEnumerable<T> source, Random rng)
    {
        if (source == null)
            throw new ArgumentNullException(nameof(source));
        if (rng == null)
            throw new ArgumentNullException(nameof(rng));

        return source.ShuffleIterator(rng);
    }

    private static IEnumerable<T> ShuffleIterator<T>(
        this IEnumerable<T> source, Random rng)
    {
        var buffer = source.ToList();
        for (int i = 0; i < buffer.Count; i++)
        {
            int j = rng.Next(i, buffer.Count);
            yield return buffer[j];

            buffer[j] = buffer[i];
        }
    }
}

이 확장 메서드를 활용하면 다음을 쉽게 수행할 수 있습니다. LINQ 쿼리 내에서 임의 크기의 무작위 하위 컬렉션을 섞고 추출합니다. 이 기술은 일반적인 데이터 조작 작업에 편리하고 효율적인 솔루션을 제공합니다.

위 내용은 무작위 하위 집합을 얻기 위한 최적의 LINQ 접근 방식은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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