Embaralhar uma lista em C#

Muhammad Maisam Abbas 16 fevereiro 2024
  1. Misture uma lista com Linq em C#
  2. Embaralhe uma lista com o algoritmo de embaralhamento de Fisher-Yates em C#
Embaralhar uma lista em C#

Neste tutorial, discutiremos métodos para embaralhar uma lista em C#.

Misture uma lista com Linq em C#

A consulta integrada de linguagem ou Linq fornece uma maneira de integrar a capacidade de consultas em C#. O Linq fornece funcionalidade exatamente como SQL em C#. Podemos usar o Linq para randomizar uma lista. O exemplo de código a seguir nos mostra como podemos embaralhar uma lista com Linq em C#.

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);
      }
    }
  }
}

Resultado:

1 4 5 3 2

Inicialmente inicializamos a lista list1 e depois embaralhamos a lista list1 com a função random.next() e a função OrderBy() do Linq em C#. O método acima também pode ser usado para embaralhar uma lista de objetos em C#. O exemplo de código a seguir nos mostra como embaralhar uma lista de objetos com Linq em C#.

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);
      }
    }
  }
}

Resultado:

Person 5 Person 2 Person 1 Person 3 Person 4

Misturamos uma lista de objetos da classe Person com o Linq em C#.

Embaralhe uma lista com o algoritmo de embaralhamento de Fisher-Yates em C#

O algoritmo de embaralhamento de Fisher-Yates embaralha uma estrutura de dados finita em C#. O algoritmo de embaralhamento Fisher-Yates fornece embaralhamento imparcial em C#. Ele armazena sequencialmente cada elemento da lista em um índice aleatório dentro da lista. O exemplo de codificação a seguir nos mostra como embaralhar uma lista com o algoritmo de embaralhamento de Fisher-Yates em C#.

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);
      }
    }
  }
}

Resultado:

5 1 4 3 2

Misturamos uma lista de inteiros list1 com o algoritmo de embaralhamento Fisher-Yates em C#. Criamos um método de extensão para implementar o algoritmo Fisher-Yates em C#. Para criar um método de extensão, tivemos que definir a função Shuffle() em outra classe static chamada ExtensionClass. O mesmo algoritmo também pode ser usado para embaralhar uma lista de objetos, conforme demonstrado nos códigos a seguir.

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);
      }
    }
  }
}

Resultado:

Person 1 Person 4 Person 2 Person 5 Person 3

Misturamos uma lista de objetos da classe Person com o algoritmo Fisher-Yates em C#. Criamos um método de extensão para implementar o algoritmo Fisher-Yates em C#. Para criar um método de extensão, tivemos que definir a função Shuffle() em outra classe static chamada ExtensionClass.

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

Artigo relacionado - Csharp List