Mescola una lista in C#

Muhammad Maisam Abbas 16 febbraio 2024
  1. Mescola una lista con Linq in C#
  2. Mescola una lista con l’algoritmo di riproduzione casuale di Fisher-Yates in C#
Mescola una lista in C#

In questo tutorial, discuteremo i metodi per mescolare una lista in C#.

Mescola una lista con Linq in C#

La query integrata nel linguaggio o Linq fornisce un modo per integrare la funzionalità delle query in C#. Linq fornisce funzionalità proprio come SQL in C#. Possiamo usare Linq per randomizzare una lista. Il seguente esempio di codice ci mostra come possiamo mescolare una lista con Linq in 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);
      }
    }
  }
}

Produzione:

1 4 5 3 2

Abbiamo prima inizializzato la lista list1 e poi mescolata la lista list1 con la funzione random.next() e la funzione OrderBy() di Linq in C#. Il metodo sopra può essere utilizzato anche per mescolare una lista di oggetti in C#. L’esempio di codice seguente mostra come mescolare una lista di oggetti con Linq in 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);
      }
    }
  }
}

Produzione:

Person 5 Person 2 Person 1 Person 3 Person 4

Abbiamo mescolato una lista di oggetti della classe Person con Linq in C#.

Mescola una lista con l’algoritmo di riproduzione casuale di Fisher-Yates in C#

L ‘algoritmo shuffle di Fisher-Yates mescola una struttura dati finita in C#. L’algoritmo di riproduzione casuale di Fisher-Yates fornisce un mescolamento imparziale in C#. Memorizza sequenzialmente ogni elemento dell’lista in un indice casuale all’interno dell’lista. Il seguente esempio di codifica ci mostra come mescolare una lista con l’algoritmo di riproduzione casuale di Fisher-Yates in 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);
      }
    }
  }
}

Produzione:

5 1 4 3 2

Abbiamo mescolato una lista di interi list1 con l’algoritmo di shuffle di Fisher-Yates in C#. Abbiamo creato un metodo di estensione per implementare l’algoritmo di Fisher-Yates in C#. Per creare un metodo di estensione, abbiamo dovuto definire la funzione Shuffle() in un’altra classe static chiamata ExtensionClass. Lo stesso algoritmo può essere utilizzato anche per mescolare una lista di oggetti, come dimostrato nei codici seguenti.

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

Produzione:

Person 1 Person 4 Person 2 Person 5 Person 3

Abbiamo mescolato una lista di oggetti della classe Person con l’algoritmo di Fisher-Yates in C#. Abbiamo creato un metodo di estensione per implementare l’algoritmo di Fisher-Yates in C#. Per creare un metodo di estensione, abbiamo dovuto definire la funzione Shuffle() in un’altra classe static chiamata 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

Articolo correlato - Csharp List