2008-10-31 12 views
11

Estaba leyendo un artículo en MSDN Magazine sobre el uso de Enumerable class in LINQ para generar una matriz aleatoria. El artículo utiliza VB.NET y no estoy seguro de lo inmediato es el equivalente en C#:matriz aleatoria utilizando LINQ y C#

Dim rnd As New System.Random() 
Dim numbers = Enumerable.Range(1, 100). _ 
    OrderBy(Function() rnd.Next) 

Respuesta

20

la Developer Fusion VB.Net to C# converter dice que el código C# equivalente es:

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

Para referencia futura , también tienen un C# to VB.Net converter. Hay several other tools disponible para esto también.

+0

editado para ser la combinación de todos. esta fue la respuesta principal en ese momento. No estoy jugando favoritos, solo manteniéndolo limpio. – TheSoftwareJedi

+0

Bien, gracias por informarme. Solo como referencia, este es el código de James Curran. – HanClinto

5
Random rnd = new Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next()); 
+0

Hmmm, Estoy obteniendo: Hmmm, obtengo: los argumentos de tipo para el método 'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable , System.Func ) 'no se puede deducir del uso. Intente especificar los argumentos de tipo explícitamente. – Ryan

+0

@Ryan: falta de parens – Jimmy

1

mejor que puedo hacer frente a la parte superior de mi cabeza que no tienen acceso a Visual Studio (cruza los dedos):

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

Al principio pensé que esto sería una mala idea ya que el algoritmo de ordenación tendrá que hacer comparaciones múltiples para los números, y obtendrá una clave de clasificación diferente para el mismo número cada vez que llame a la lambda para ese número. Sin embargo, parece que solo lo llama una vez para cada elemento de la lista y almacena ese valor para usarlo más adelante. Este código muestra esto:

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

Utilizando el C5 Generic Collection Library, es posible que utilices la orden interna Shuffle() método:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100)); 
numbers.Shuffle(); 
+0

Me gusta. Bonito. – Ryan

4

¿Qué hay de algo mucho más fácil ...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString()) 
Cuestiones relacionadas