ランダムな配列
上記リンク先で配列の生成方法についてまとめています。今回は配列をランダムな順に並び替える(つまりシャッフルする)方法をまとめます。配列を扱っていますが、実際はコレクション要素(Listなど)であれば同様に処理できます。
配列のランダムソート(シャッフル)
任意の配列について、ランダムな順にソートする方法です。
// シャッフルするもとの配列
int[] ary1 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// ランダムな順にソートされた配列
int[] ary2 = ary1.OrderBy(i => Guid.NewGuid()).ToArray();
ソート処理自体は、OrderBy メソッドを使用します。ソートのキーには、GUIDを生成して使用します。
GUIDとは、128ビットの整数値からなる、データを一意に識別するために用いられる識別子のことです。GUIDが重複することは実用上ほぼありません。このGUIDをキーとしてソートすることでランダムな並び順になります。
拡張メソッド
ランダムソートをよく使用するのであれば、OrderBy メソッドを何度も書くのは手間なので、拡張メソッドで呼び出せるようにしておくと便利です。以下の例では、拡張メソッド Shuffle を定義しています。
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
//シャッフルする配列
int[] ary1 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//シャッフルする
int[] ary2 = ary1.Shuffle().ToArray();
// 結果表示
Console.WriteLine(string.Join(", ", ary2));
}
}
// IEnumerable に拡張メソッド定義
public static class IEnumerableExtension
{
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> collection)
{
return collection.OrderBy(i => Guid.NewGuid());
}
}
参考URL
コメントを書く