ホームページ >バックエンド開発 >C++ >ランダムなサブセットを取得するための最適な LINQ アプローチは何ですか?

ランダムなサブセットを取得するための最適な LINQ アプローチは何ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-31 19:58:16500ブラウズ

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

ランダムなサブコレクション抽出に最適な LINQ 拡張機能

プログラミングの世界では、特定のコレクションからランダムなサブセットを抽出することが必要になることがよくあります。 LINQ 愛好家にとって、これを実現する最適な方法について疑問に思われるかもしれません。

1 つのアプローチは、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。