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

时间:2009-01-06 19:45:23

标签: c# .net random

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

7 个答案:

答案 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();

Credit

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

试试此代码here

它使用IComparer.Compare

如果您使用generics

执行此功能,这将是一个很好的做法