Pregunta

Estaba leyendo un artículo en la revista MSDN sobre el uso de Clase enumerable en LINQ para generar una matriz aleatoria. El artículo usa VB.NET y no estoy inmediatamente seguro de cuál es el equivalente en C #:

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

Solución

El Developer Fusion VB.Net al convertidor de C # 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 convertidor de C # a VB.Net . También hay otras herramientas disponibles para esto.

Otros consejos

Inicialmente pensé que esto sería una mala idea ya que el algoritmo de clasificación tendrá que hacer múltiples comparaciones 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 su uso posterior. Este código demuestra 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);
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());

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

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

Lo mejor que puedo hacer fuera de mi cabeza sin tener acceso a Visual Studio (cruza los dedos):

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

Al utilizar la Biblioteca de colecciones genéricas C5 , solo puede usar el Shuffle incorporado () método:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top