「C♯で配列やコレクションをシャッフルする」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「C#にもPHPのshuffle(&Array)のパクリが欲しい。 ググると出てきたLINQ使ったやつ。 <source lang="csharp"> public static class IEnumerabl…」)
(相違点なし)

2019年11月26日 (火) 07:44時点における版

C#にもPHPのshuffle(&Array)のパクリが欲しい。

ググると出てきたLINQ使ったやつ。

    public static class IEnumerableExtension
    {
        public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> collection)
        {
            return collection.OrderBy(i => Guid.NewGuid());
        }
    }

乱数生成器が指定できたほうがよくね?Randomクラスはアルゴリズムがよろしくないらしいが、シールドクラスではないのでメルセンヌ・ツイスタあたりを実装すればいい。

    public static class IEnumerableExtensions
    {
        public static IEnumerable<TSource> Shuffle<TSource>(this IEnumerable<TSource> source, Random random)
        {
            var copy = source.ToList();

            int count = 0;
            while (0 < (count = copy.Count))
            {
                int index = random.Next(count);
                yield return copy[index];
                copy.RemoveAt(index);
            }
        }

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