2008-10-31 8 views
11

Ich habe einen Artikel im MSDN Magazine über die Verwendung der Enumerable class in LINQ gelesen, um ein zufälliges Array zu generieren. Der Artikel basiert VB.NET und ich bin nicht sicher, was sofort das Äquivalent in C# ist:Zufälliges Array mit LINQ und C#

Dim rnd As New System.Random() 
Dim numbers = Enumerable.Range(1, 100). _ 
    OrderBy(Function() rnd.Next) 

Antwort

20

Die Developer Fusion VB.Net to C# converter sagt, dass die äquivalente C# -Code ist:

System.Random rnd = new System.Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next()); 

Für die Zukunft Sie haben auch eine C# to VB.Net converter. Dafür stehen auch several other tools zur Verfügung.

+0

bearbeitet, um die Kombination von jedermanns zu sein. Das war die beste Antwort zu der Zeit. Ich spiele keine Favoriten, sondern halte sie sauber. – TheSoftwareJedi

+0

Okay, danke, dass du mich informiert hast. Nur als Referenz, das ist James Currans Code. – HanClinto

5
Random rnd = new Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next()); 
+0

Hmmm, ich bekomme: Hmmm, ich bekomme: Die Typargumente für die Methode 'System.Linq.Enumerable.OrderBy (System.Collections.Generic.IEnumerable , System.Func ) 'kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben. – Ryan

+0

@Ryan: fehlende Parens – Jimmy

1

Best I ohne Zugang zu Visual Studio aus der Spitze von meinem Kopf tun (Kreuz Finger):

System.Random rnd = New System.Random(); 
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next); 
5

Ich dachte zunächst dies eine schlechte Idee wäre, da der Sortieralgorithmus mehr Vergleiche tun muß, wird für die Nummern, und es wird jedes Mal, wenn es das Lambda für diese Nummer aufruft, einen anderen Sortierschlüssel für dieselbe Nummer erhalten. Es sieht jedoch so aus, als würde es nur einmal für jedes Element in der Liste aufrufen und speichert diesen Wert für die spätere Verwendung. Dieser Code zeigt dies:

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); 
1

der C5 Generic Collection Library benutzen, könnten Sie einfach die eingebaute Shuffle() Methode verwenden:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100)); 
numbers.Shuffle(); 
+0

Ich mag es. Nett. – Ryan

4

Was ist mit etwas viel leichter ...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())