2011-05-29 65 views
4

我有一個清單最快的方式隨機重新排序LINQ集合?

我想重新排序它,所以他們是在隨機順序。

什麼是做到這一點(以最快的,我的意思是至少的代碼量)

+0

可能重複(http://stackoverflow.com/questions/273313/隨機化一個清單) – nawfal 2013-02-12 10:51:03

回答

5

如果你想隨機重新排序到位你應該改組列表,以擴展方法的使用是那麼簡單的一行。這假定你已經有一個基於IList的集合。

用法:myList.Shuffle();

public static void Shuffle<T>(this IList<T> list) 
{ 
    Random rng = new Random(); 
    int n = list.Count; 
    while (n > 1) 
    { 
     n--; 
     int k = rng.Next(n + 1); 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 
} 

幸得這樣的回答:中[隨機排列在C#中的列表 ] Randomize a List<T>

9

注意的最快方法:每mquander的評論如,下面的答案是不執行的推薦方式「隨機排序「因爲它在語義上不正確,與接受的shuffle算法相比效率不高,它基於Guid s, 的私有實現細節,甚至濫用LINQ查詢語法。然而,OP所要求的是「最少量的代碼」(根據自己的書面形式而不是由框架處理)爲 。

var randomOrdering = yourList.OrderBy(o => Guid.NewGuid()); 
+0

+1淫,但不錯。甚至優雅! – corlettk 2011-05-29 01:32:15

+6

既不好也不高雅。如果您想「按隨機數排序」,則生成隨機數字,不要生成GUID。如果你想洗個清單,使用洗牌算法,不要「按隨機數排序」。 – mquander 2011-05-29 01:44:55

+0

mquander:我使用了另一種運行良好但出於好奇的解決方案,爲什麼這個答案不好呢?生成GUID比生成一個隨機數要花費更多時間嗎? – Diskdrive 2011-05-29 03:43:29