在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算法。
让我指导一种错误的做法,以及我以前认可的方式,直到这篇博文发表之前从未见过它的错误:
我最喜欢的改组方法是使用N * log N sort并传递一个返回随机结果的排序谓词。 它具有很好的function,可以使用构建块使用最少的新代码来完成,即使是最条纹的版本,大多数语言都可以使用它。
我将创建一个新的List并用随机选择并从原始List中删除的项填充它。
在这里试试这个代码
它使用IComparer.Compare
如果使用generics执行此function,这将是一个很好的做法