2011-05-29 95 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