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

ページの作成:「C#にもPHPのshuffle(&Array)のパクリが欲しい。 ググると出てきたLINQ使ったやつ。 <source lang="csharp"> public static class IEnumerabl…」
 
編集の要約なし
 
(同じ利用者による、間の1版が非表示)
3行目: 3行目:
[[ググる]]と出てきた[[LINQ]]使ったやつ。
[[ググる]]と出てきた[[LINQ]]使ったやつ。
<source lang="csharp">
<source lang="csharp">
    using System;
    using System.Collections.Generic;
    using System.Linq;
     public static class IEnumerableExtension
     public static class IEnumerableExtension
     {
     {
12行目: 16行目:
</source>
</source>


乱数生成器が指定できたほうがよくね?Randomクラスはアルゴリズムがよろしくないらしいが、シールドクラスではないのでメルセンヌ・ツイスタあたりを実装すればいい。
 
乱数生成器が指定できたほうがよくね?Randomクラスは[[アルゴリズム]]がよろしくないらしいが、シールドクラスではないのでメルセンヌ・ツイスタあたりを実装すればいい。
* [[C♯でメルセンヌ・ツイスタ乱数]]
* [[C♯でメルセンヌ・ツイスタ乱数]]
<source lang="csharp">
<source lang="csharp">
     public static class IEnumerableExtensions
    using System;
    using System.Collections.Generic;
    using System.Linq;
 
     public static class IEnumerableExtension
     {
     {
         public static IEnumerable<TSource> Shuffle<TSource>(this IEnumerable<TSource> source, Random random)
         public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> collection, Random random)
         {
         {
             var copy = source.ToList();
             return collection.OrderBy(i => random.Next());
 
            int count = 0;
            while (0 < (count = copy.Count))
            {
                int index = random.Next(count);
                yield return copy[index];
                copy.RemoveAt(index);
            }
         }
         }


36行目: 37行目:
     }
     }
</source>
</source>
== 関連項目 ==
* [[C♯で配列やコレクションをチャンク分け]]
* [[C♯でメルセンヌ・ツイスタ乱数]]