差分

ナビゲーションに移動 検索に移動

C♯で配列やコレクションをシャッフルする

1,307 バイト追加, 2019年11月26日 (火) 07:44
ページの作成:「C#にもPHPのshuffle(&Array)のパクリが欲しい。 ググると出てきたLINQ使ったやつ。 <source lang="csharp"> public static class IEnumerabl…」
C#にもPHPのshuffle(&Array)のパクリが欲しい。

[[ググる]]と出てきた[[LINQ]]使ったやつ。
<source lang="csharp">
public static class IEnumerableExtension
{
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> collection)
{
return collection.OrderBy(i => Guid.NewGuid());
}
}
</source>

乱数生成器が指定できたほうがよくね?Randomクラスはアルゴリズムがよろしくないらしいが、シールドクラスではないのでメルセンヌ・ツイスタあたりを実装すればいい。
* [[C♯でメルセンヌ・ツイスタ乱数]]
<source lang="csharp">
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());
}
}
</source>

案内メニュー