una - propiedad random c#
Matriz aleatoria utilizando LINQ y C# (6)
Estaba leyendo un artículo en MSDN Magazine sobre el uso de la clase Enumerable en LINQ para generar una matriz aleatoria. El artículo usa VB.NET y no estoy 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)
El convertidor de Developer Fusion VB.Net a 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 . Hay muchas otras herramientas disponibles para esto también.
Inicialmente pensé que esto sería una mala idea, ya que el algoritmo de ordenamiento deberá 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 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);
Lo mejor que puedo hacer 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);
Con la Biblioteca de colecciones genéricas de C5 , puede usar el método integrado Shuffle()
:
IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();
¿Qué pasa con algo mucho más fácil ...
Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());