Array casuale usando LINQ e C #

Stavo leggendo un articolo su MSDN Magazine sull’uso della class Enumerable 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) 

Il convertitore Developer Fusion VB.Net in C # afferma che il codice C # equivalente è:

 System.Random rnd = new System.Random(); IEnumerable numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next()); 

Per riferimento futuro, hanno anche un convertitore da C # a VB.Net . Ci sono molti altri strumenti disponibili anche per questo.

Inizialmente pensavo che sarebbe stata una ctriggers idea dato che l’algoritmo di ordinamento avrebbe dovuto fare confronti multipli per i numeri, e otterrà una chiave di ordinamento diversa per lo stesso numero ogni volta che chiama il lambda per quel numero. Tuttavia, sembra che lo chiami solo una volta per ciascun elemento nell’elenco e lo memorizzi per un uso successivo. Questo codice dimostra questo:

 int timesCalled = 0; Random rnd = new Random(); List numbers = Enumerable.Range(1, 100).OrderBy(r => { timesCalled++; return rnd.Next(); } ).ToList(); Assert.AreEqual(timesCalled, 100); 
 Random rnd = new Random(); IEnumerable 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()) 

La cosa migliore che posso fare è di non avere accesso a Visual Studio (incrocia le dita):

 System.Random rnd = New System.Random(); IEnumerable numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next); 

Utilizzando la libreria di raccolta generica C5 , puoi semplicemente utilizzare il metodo Shuffle() incorporato:

 IList numbers = new ArrayList(Enumerable.Range(1,100)); numbers.Shuffle();