我有一个对象列表,我想在每个请求上随机重新排序。这样做的最佳方式是什么?
答案 0 :(得分:12)
某种Knuth-Fisher-Yates shuffle algorithm怎么样?
for (int i = cards.Length - 1; i > 0; i--)
{
int n = rand.Next(i + 1);
Swap(ref cards[i], ref cards[n]);
}
代码取自Coding Horror。这也是关于人们经常如何做错的推荐读物。
答案 1 :(得分:6)
看看这种酷炫的Linq方式:
public class Employee
{
public int Id
{
get;
set;
}
public string Name
{
get;
set;
}
}
填充列表:
List<Employee> list = new List<Employee>();
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();
答案 2 :(得分:2)
您可以使用以线性时间运行的Fisher-Yates shuffle算法。
答案 3 :(得分:2)
让我指导你采用一种错误的方式,以及我以前认可的方式,直到这篇博文发布之前从未见过它的错误:
答案 4 :(得分:1)
我最喜欢的改组解决方案是使用N * log N sort并传递一个返回随机结果的排序谓词。它具有很好的功能,可以使用构建块使用最少的新代码来完成,即使是最条纹的版本,大多数语言都可以使用它。
答案 5 :(得分:0)
我会创建一个新的List并用随机选择并从原始List中删除的项目填充它。
答案 6 :(得分:0)