Pergunta

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top