【发布时间】:2010-09-29 21:22:26
【问题描述】:
我有一个对象列表,我想在每个请求中随机重新排序它们。这样做的最佳方法是什么?
【问题讨论】:
-
这应该是标准 .net 类库的一部分...
我有一个对象列表,我想在每个请求中随机重新排序它们。这样做的最佳方法是什么?
【问题讨论】:
我最喜欢的洗牌解决方案是使用 N*log N 排序并传递给它一个返回随机结果的排序谓词。它有一个很好的功能,可以使用大多数语言甚至在最条纹版本中使用的构建块,只需最少的新代码即可完成。
【讨论】:
看看这个很酷的 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();
【讨论】:
我将创建一个新列表,并用从原始列表中随机选择和删除的项目填充它。
【讨论】:
让我告诉你一种错误的方法,我承认我以前用过的一种方法,直到这篇博文才发现它的错误:
【讨论】:
某种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。这也是一个关于人们经常犯错的推荐读物。
【讨论】:
您可以使用以线性时间运行的Fisher-Yates shuffle 算法。
【讨论】: