在c#中随机重新排列项目列表的最佳方法是什么?

我有一个对象列表,我想在每个请求上随机重新排序。 这样做的最佳方式是什么?

某种Knuth-Fisher-Yates shuffle算法怎么样?

for (int i = cards.Length - 1; i > 0; i--) { int n = rand.Next(i + 1); Swap(ref cards[i], ref cards[n]); } 

代码取自Coding Horror 。 这也是关于人们经常如何做错的推荐读物。

看看这个很酷的Linq做法:

 public class Employee { public int Id { get; set; } public string Name { get; set; } } 

填充列表:

  List list = new List(); list.Add(new Employee { Id = 1, Name = "Davolio Nancy" }); list.Add(new Employee { Id = 2, Name = "Fuller Andrew" }); list.Add(new Employee { Id = 3, Name = "Leverling Janet" }); list.Add(new Employee { Id = 4, Name = "Peacock Margaret" }); list.Add(new Employee { Id = 5, Name = "Buchanan Steven" }); list.Add(new Employee { Id = 6, Name = "Suyama Michael" }); list.Add(new Employee { Id = 7, Name = "King Robert" }); list.Add(new Employee { Id = 8, Name = "Callahan Laura" }); list.Add(new Employee { Id = 9, Name = "Dodsworth Anne" }); 

然后排序:

  list = list.OrderBy(emp => Guid.NewGuid()).ToList(); 

信用

您可以使用在线性时间运行的Fisher-Yates shuffle算法。

让我指导一种错误的做法,以及我以前认可的方式,直到这篇博文发表之前从未见过它的错误:

http://www.codinghorror.com/blog/archives/001015.html

我最喜欢的改组方法是使用N * log N sort并传递一个返回随机结果的排序谓词。 它具有很好的function,可以使用构建块使用最少的新代码来完成,即使是最条纹的版本,大多数语言都可以使用它。

我将创建一个新的List并用随机选择并从原始List中删除的项填充它。

在这里试试这个代码

它使用IComparer.Compare

如果使用generics执行此function,这将是一个很好的做法