LINQ の最適化: ランダムにシャッフルされたサブコレクションの取得
より大きなコレクションのランダムなサブセットを取得する効率的な方法を決定することは、プログラミング。 LINQ クエリの場合、Shuffle() 拡張メソッドを利用する方法があります。
Shuffle メソッド:
Shuffle() メソッドは、IEnumerable コレクションを入力として受け取ります。そしてシャッフルされたバージョンを返します。このメソッドは、コレクション内の要素のランダムな順序を取得する必要がある場合に特に便利です。
Fisher-Yates-Durstenfeld Shuffle:
Shuffle() メソッドFisher-Yates-Durstenfeld シャッフル アルゴリズムを採用しており、コレクションをシャッフルする堅牢かつ効率的な手段を提供します。このアルゴリズムでは、要素を後続の要素とランダムに交換しながらコレクションを反復処理します。
LINQ 拡張メソッド:
以下は、Fisher を実装する LINQ フレンドリーな拡張メソッドです。 IEnumerable で使用する Yates-Durstenfeld シャッフルコレクション:
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]; } } }
使用法:
Shuffle() メソッドを利用するには、目的のコレクションでこのメソッドを呼び出すだけです:
var yourCollection = new List<int> { 1, 2, 3, 4, 5 }; var randomItems = yourCollection.Shuffle().Take(3);
これにより、あなたのコレクションから 3 つのランダムなアイテムのシャッフルされたコレクションが生成されます。デフォルトでは、Shuffle() メソッドはランダム化に新しい Random() インスタンスを使用します。カスタム シャッフル動作用にカスタム Random インスタンスを指定することもできます。
以上がLINQ を使用してコレクションからランダムなサブセットを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。