2009-08-17 8 views
5

En python, vous pouvez faire quelque chose comme ceci:Fill Liste <int> LINQ

arr = list(set(randint(-50, 50) for _ in range(10))) 

Je ne sais comment programmer une méthode d'extension qui remplit un tableau, une liste ou tout ce que vous avez besoin avec des valeurs aléatoires. Je trouve cela encombrant, et j'admire vraiment comment vous pouvez le faire en python. Bien que, je sais seulement de Enumerable.Range, qui peut seulement être utilisé pour générer des séquences fixes, à ma connaissance.

Est-ce possible aussi en C#?

Répondre

10

Vous pouvez faire comme ceci:

Random rnd = new Random(); 
List<int> = Enumerable.Range(0,10).Select(n => rnd.Next(-50, 51)).ToList(); 
+0

Ah, je ne pouvais tout simplement pas comprendre comment appeler select avec Enumerable.Range. Merci! – CasperT

+0

+1 C'est la solution que je viens de mettre en place, mais vous m'avez battu. –

+0

Cela ne retournerait-il pas éventuellement des nombres en double dans la liste? –

2
var r = new Random(); 

var l = Enumerable.Range(10).Select(x => r.Next(100) - 50).ToList(); 
+1

Cela ne compile pas. 'Enumerable.Range' prend deux arguments - start et count. Vous devez passer un 0 comme premier argument. – adrianbanks

+0

Oui, je n'ai pas vérifié. – leppie

2

Bien sûr, quelque chose comme ...

Random r = new Random(); 
var ints = Enumerable.Range(0, 50).OrderBy(i => r.Next()); 
+0

Notez, celui-ci est plus comme un shuffle (si c'est ce que vous êtes après) d'autre part le select est la meilleure réponse. –

+0

Notez qu'il existe un léger biais avec cette méthode lorsque vous obtenez des nombres aléatoires en double. La meilleure méthode de shuffle est un classique de Knuth, décrit ici: http://stackoverflow.com/questions/1262480/how-to-shuffle-a-listt/1262521 – Guffa

1

Juste pour ajouter une variante, vous pouvez créer une méthode statique très simple comme celui-ci :

public static IEnumerable<int> RandomSequence(int minValue, int maxValue) 
    { 
     Random r = new Random(); 
     while (true) 
      yield return r.Next(minValue, maxValue); 
    } 

Et puis l'utiliser comme thi s:

var numbers = RandomSequence(-50, 50).Take(10)); 

    foreach(var number in numbers) 
     Console.WriteLine(number); 

I love yield return ... hehe c »,)

Questions connexes