C# でリストをシャッフルする
このチュートリアルでは、C# でリストをシャッフルする方法について説明します。
C# の Linq でリストをシャッフルする
統合言語クエリまたは Linq
は、クエリの機能を C# に統合する方法を提供します。Linq は、C# の SQL と同じような機能を提供します。Linq を使用してリストをランダム化できます。次のコード例は、C# で Linq を使用してリストをシャッフルする方法を示しています。
using System;
using System.Collections.Generic;
using System.Linq;
namespace shuffle_list {
class Program {
static void Main(string[] args) {
List<int> list1 = new List<int>() { 1, 2, 3, 4, 5 };
var rnd = new Random();
var randomized = list1.OrderBy(item => rnd.Next());
foreach (var value in randomized) {
Console.WriteLine(value);
}
}
}
}
出力:
1
4
5
3
2
最初にリスト list1
を初期化し、次にリスト list1
を C# の Linq の random.next()
関数と OrderBy()
関数でシャッフルしました。上記のメソッドは、C# でオブジェクトのリストをシャッフルするためにも使用できます。次のコード例は、C# で Linq を使用してオブジェクトのリストをシャッフルする方法を示しています。
using System;
using System.Collections.Generic;
using System.Linq;
namespace shuffle_list {
public class Person {
string name;
public Person(string name) {
Name = name;
}
public string Name {
get => name;
set => name = value;
}
}
class Program {
static void Main(string[] args) {
List<Person> list1 = new List<Person>();
list1.Add(new Person("Person 1"));
list1.Add(new Person("Person 2"));
list1.Add(new Person("Person 3"));
list1.Add(new Person("Person 4"));
list1.Add(new Person("Person 5"));
var rnd = new Random();
var randomized = list1.OrderBy(item => rnd.Next());
foreach (var value in randomized) {
Console.WriteLine(value.Name);
}
}
}
}
出力:
Person 5
Person 2
Person 1
Person 3
Person 4
Person
クラスのオブジェクトのリストを C# の Linq でシャッフルしました。
C# で Fisher-Yates シャッフルアルゴリズムを使用してリストをシャッフルする
Fisher-Yates シャッフルアルゴリズムは、C# で有限のデータ構造をシャッフルします。フィッシャー-イェーツシャッフルアルゴリズムは、C# で偏りのないシャッフルを提供します。リストの各要素をリスト内のランダムなインデックスに順番に格納します。次のコーディング例は、C# で Fisher-Yates シャッフルアルゴリズムを使用してリストをシャッフルする方法を示しています。
using System;
using System.Collections.Generic;
using System.Linq;
namespace shuffle_list {
static class ExtensionsClass {
private static Random rng = new Random();
public static void Shuffle<T>(this IList<T> list) {
int n = list.Count;
while (n > 1) {
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}
class Program {
static void Main(string[] args) {
List<int> list1 = new List<int>() { 1, 2, 3, 4, 5 };
list1.Shuffle();
foreach (var value in list1) {
Console.WriteLine(value);
}
}
}
}
出力:
5
1
4
3
2
C# の Fisher-Yates シャッフルアルゴリズムを使用して、整数のリスト list1
をシャッフルしました。C# で Fisher-Yates アルゴリズムを実装するための拡張メソッドを作成しました。拡張メソッドを作成するには、ExtensionClass
と呼ばれる別の静的
クラスで Shuffle()
関数を定義する必要がありました。以下のコードに示すように、同じアルゴリズムを使用してオブジェクトのリストをシャッフルすることもできます。
using System;
using System.Collections.Generic;
using System.Linq;
namespace shuffle_list {
public class Person {
string name;
public Person(string name) {
Name = name;
}
public string Name {
get => name;
set => name = value;
}
}
static class ExtensionsClass {
private static Random rng = new Random();
public static void Shuffle<T>(this IList<T> list) {
int n = list.Count;
while (n > 1) {
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}
class Program {
static void Main(string[] args) {
List<Person> list1 = new List<Person>();
list1.Add(new Person("Person 1"));
list1.Add(new Person("Person 2"));
list1.Add(new Person("Person 3"));
list1.Add(new Person("Person 4"));
list1.Add(new Person("Person 5"));
list1.Shuffle();
foreach (var value in list1) {
Console.WriteLine(value.Name);
}
}
}
}
出力:
Person 1
Person 4
Person 2
Person 5
Person 3
クラス Person
のオブジェクトのリストを C# の Fisher-Yates アルゴリズムでシャッフルしました。C# で Fisher-Yates アルゴリズムを実装するための拡張メソッドを作成しました。拡張メソッドを作成するには、ExtensionClass
と呼ばれる別の静的
クラスで Shuffle()
関数を定義する必要がありました。
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn