Matrice casuale usando LINQ e C #
-
05-07-2019 - |
Domanda
Stavo leggendo un articolo su MSDN Magazine sull'uso della Classe enumerabile in LINQ per generare un array casuale. L'articolo utilizza VB.NET e non sono immediatamente sicuro di quale sia l'equivalente in C #:
Dim rnd As New System.Random()
Dim numbers = Enumerable.Range(1, 100). _
OrderBy(Function() rnd.Next)
Soluzione
Il Convertitore VB.Net a C # Developer Fusion afferma che il codice C # equivalente è:
System.Random rnd = new System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
Per riferimento futuro, hanno anche un Convertitore C # in VB.Net . Ci sono molti altri strumenti disponibili anche per questo.
Altri suggerimenti
Inizialmente pensavo che sarebbe stata una cattiva idea poiché l'algoritmo di ordinamento dovrà fare più confronti per i numeri e otterrà una chiave di ordinamento diversa per lo stesso numero ogni volta che chiama lambda per quel numero. Tuttavia, sembra che lo chiami una sola volta per ogni elemento nell'elenco e memorizzi quel valore per un uso successivo. Questo codice lo dimostra:
int timesCalled = 0;
Random rnd = new Random();
List<int> numbers = Enumerable.Range(1, 100).OrderBy(r =>
{
timesCalled++;
return rnd.Next();
}
).ToList();
Assert.AreEqual(timesCalled, 100);
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
Che dire di qualcosa di molto più facile ...
Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
Il meglio che posso fare dalla parte superiore della mia testa senza accesso a Visual Studio (incrocia le dita):
System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);
Utilizzando la C5 Generic Collection Library , puoi semplicemente usare il Shuffle incorporato ()
metodo:
IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();