C# でリストをシャッフルする

  1. C# の Linq でリストをシャッフルする
  2. C# で Fisher-Yates シャッフルアルゴリズムを使用してリストをシャッフルする

このチュートリアルでは、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() 関数を定義する必要がありました。

関連記事 - Csharp List

  • C# でリストからアイテムを削除