2009-08-17 3 views
5

in Python si può fare qualcosa di simile:Lista Fill <int> utilizzando LINQ

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

so come programmare un metodo di estensione che riempie un array, lista o qualsiasi altra cosa che ti serve con valori casuali. Trovo che questo sia macchinoso, e ammiro molto il modo in cui puoi farlo in Python. Anche se, so solo di Enumerable.Range, che può essere utilizzato solo per generare sequenze fisse, per quanto ne so.

È possibile anche in C#?

risposta

10

Si potrebbe fare così:

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

Ah, semplicemente non riuscivo a capire come richiamare selezionare insieme a Enumerable.Range. Grazie! – CasperT

+0

+1 Questa è la soluzione che ho appena messo insieme, ma mi hai battuto su di esso. –

+0

Questo non potrebbe restituire numeri duplicati nella lista? –

2
var r = new Random(); 

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

Questo non può essere compilato. 'Enumerable.Range' prende due argomenti: inizia e conta. Devi passare uno 0 come primo argomento. – adrianbanks

+0

Sì, non ho controllato. – leppie

2

Certo, qualcosa di simile ...

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

Nota, questo è più simile a un shuffle (se questo è quello che stai dopo) l'altro saggio la selezione è la risposta migliore. –

+0

Si noti che c'è un leggero disallineamento con quel metodo quando si ottengono numeri casuali duplicati. Il miglior metodo shuffle è un classico di Knuth, qui descritto: http://stackoverflow.com/questions/1262480/how-to-shuffle-a-listt/1262521 – Guffa

1

solo per aggiungere una variante, è possibile creare un metodo statico molto semplice come questo :

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

E quindi utilizzare come thi s:

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

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

amo yield return ... hehe c",)