2009-08-17 20 views
5

W Pythonie można zrobić coś takiego:Fill Lista <int> użyciu LINQ

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

wiem jak zaprogramować metodę rozszerzenia, które wypełnia tablicę, listy lub cokolwiek trzeba z wartościami losowymi. Uważam, że to nieporęczne i naprawdę podoba mi się, jak można to zrobić w python. Mimo, że wiem tylko o Enumerable.Range,, które tylko mogą być używane do generowania stałych sekwencji, według mojej wiedzy.

Czy to również możliwe w języku C#?

Odpowiedz

10

Można zrobić tak:

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

Ah, po prostu nie mogłem wymyślić, jak wywołać select wraz z Enumerable.Range. Dzięki! – CasperT

+0

+1 To jest rozwiązanie, które po prostu zebrałem, ale biłeś mnie. –

+0

Czy to prawdopodobnie nie przywróci duplikatów liczb do listy? –

2
var r = new Random(); 

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

nie skompilować. 'Enumerable.Range' przyjmuje dwa argumenty - start i count. Musisz podać 0 jako pierwszy argument. – adrianbanks

+0

Tak, nie sprawdziłem. – leppie

2

Jasne, coś jak ...

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

Uwaga, ta jest bardziej jak shuffle (jeśli to jest to, czego szukasz), w przeciwnym razie wybór jest lepszą odpowiedzią. –

+0

Należy zwrócić uwagę, że metoda ta ma niewielkie nachylenie, gdy otrzymasz zduplikowane liczby losowe. Najlepszą metodą shuffle jest klasyczny Knuth, opisany tutaj: http://stackoverflow.com/questions/1262480/how-to-shuffle-a-listt/1262521 – Guffa

1

Wystarczy dodać odmianę, można stworzyć bardzo prostą metodę statyczną takiego :

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

A potem użyj go tak jak s:

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

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

Kocham yield return ... hehe c”)

Powiązane problemy