matriz aleatória usando LINQ e C #
-
05-07-2019 - |
Pergunta
Eu estava lendo um artigo sobre MSDN Magazine sobre como usar o href="http://msdn.microsoft.com/en-us/magazine/cc700332.aspx" rel="noreferrer"> classe para gerar uma matriz aleatória. O artigo usa VB.NET e eu não sou imediatamente certeza do que o equivalente está em C #:
Dim rnd As New System.Random()
Dim numbers = Enumerable.Range(1, 100). _
OrderBy(Function() rnd.Next)
Solução
O # conversor Developer Fusion VB.Net para C diz que o código equivalente C # é:
System.Random rnd = new System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());
Para referência futura, eles também têm uma C # para VB.Net conversor . Há várias outras ferramentas disponível para isso também.
Outras dicas
Inicialmente eu pensei que esta seria uma má idéia desde o algoritmo de ordenação vai precisar fazer comparações múltiplas para os números, e ele irá obter uma chave de classificação diferente para o mesmo número cada vez que ele chama o lambda para esse número. No entanto, parece que ele só chama-lo uma vez para cada elemento na lista, e armazena esse valor para uso posterior. Este código demonstra isso:
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());
E sobre algo muito mais fácil ...
Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())
Melhor que posso fazer fora do topo da minha cabeça, sem acesso ao Visual Studio (cruzes dedos):
System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);
Usando o C5 Generic Coleção Biblioteca , você pode simplesmente usar o método incorporado Shuffle()
:
IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();