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)
È stato utile?

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();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top