2008-10-31 60 views
11

我正在閱讀MSDN Magazine上關於使用Enumerable class in LINQ生成隨機數組的文章。文章使用VB.NET,我沒有立即確認相當於是在C#是什麼:使用LINQ和C的隨機數組#

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

回答

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

嗯,我'm getting:嗯,我得到:方法'System.Linq.Enumerable.OrderBy 的類型參數(System.Collections.Generic.IEnumerable ,System.Func )'不能從使用中推斷出來。嘗試明確指定類型參數。 – Ryan 2008-10-31 20:36:44

+0

@Ryan:失蹤parens – Jimmy 2008-10-31 21:56:20

1

盡我所能了我的頭頂部做得不到到Visual Studio(交叉手指):

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

我最初以爲這將是一個糟糕的主意,因爲排序算法需要做多重比較對於數字,每次調用該數字的lambda時,它將獲得相同編號的不同排序鍵。但是,它看起來只是爲列表中的每個元素調用一次,並存儲該值供以後使用。此代碼演示了這一點:

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

使用C5 Generic Collection Library,你可以只使用內置的Shuffle()方法:

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

什麼東西更容易...

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