2009-08-17 14 views
5

in Python Sie etwas tun können:Fill Liste <int> mit LINQ

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

weiß ich, wie eine Erweiterungsmethode zu programmieren, die ein Array, Liste füllt oder was auch immer Sie mit zufälligen Werten benötigen. Ich finde das jedoch umständlich, und ich bewundere wirklich, wie man es in Python machen kann. Ich kenne zwar nur Enumerable.Range,, die meines Wissens nur zur Generierung fester Sequenzen verwendet werden können.

Ist es auch in C# möglich?

Antwort

10

Sie könnten wie folgt tun:

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

Ah, ich konnte einfach nicht herausfinden, wie Select zusammen mit Enumerable.Range aufrufen. Vielen Dank! – CasperT

+0

+1 Das ist die Lösung, die ich gerade auch zusammengestellt habe, aber du hast mich dazu geschlagen. –

+0

Könnte das nicht möglicherweise doppelte Nummern in die Liste zurückgeben? –

2
var r = new Random(); 

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

Diese nicht kompiliert. 'Enumerable.Range' nimmt zwei Argumente - Start und Count. Sie müssen eine 0 als erstes Argument übergeben. – adrianbanks

+0

Ja, ich habe es nicht überprüft. – leppie

2

Sicher, So etwas wie ...

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

Hinweis, dieser ist eher wie ein Shuffle (wenn das das ist, wonach du suchst), anderenfalls ist die Auswahl die bessere Antwort. –

+0

Beachten Sie, dass bei der Verwendung doppelter Zufallszahlen eine leichte Verzerrung mit dieser Methode auftritt. Die beste Shuffle-Methode ist ein Klassiker von Knuth, der hier beschrieben wird: http://stackoverflow.com/questions/1262480/how-to-shuffle-a-listt/1262521 – Guffa

1

nur eine Variante hinzufügen, können Sie eine sehr einfache statische Methode wie folgt erstellen :

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

Und dann verwenden Sie es wie thi s:

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

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

Ich liebe yield return ... hehe c“)