C#에서 목록 섞기

Muhammad Maisam Abbas 2023년12월11일
  1. C#에서 Linq로 목록 섞기
  2. Fisher-Yates Shuffle 알고리즘을 사용하여 목록 섞기
C#에서 목록 섞기

이 자습서에서는 C#에서 List를 섞는 방법에 대해 설명합니다.

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목록을 초기화 한 다음random.next()함수와 C#의 Linq OrderBy()함수를 사용하여list1목록을 섞었습니다. 위의 방법을 사용하여 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와 섞었습니다.

Fisher-Yates Shuffle 알고리즘을 사용하여 목록 섞기

Fisher-Yates 셔플 알고리즘은 C#에서 유한 데이터 구조를 셔플합니다. Fisher-Yates 셔플 알고리즘은 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라는 다른static클래스에서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

C#에서 Fisher-Yates 알고리즘을 사용하여Person클래스의 객체 목록을 섞었습니다. C#에서 Fisher-Yates 알고리즘을 구현하기위한 확장 메서드를 만들었습니다. 확장 메서드를 생성하려면ExtensionClass라는 다른static클래스에서Shuffle()함수를 정의해야했습니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

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

관련 문장 - Csharp List