簡體   English   中英

在c#中隨機重新排列項目列表的最佳方法是什么?

[英]What is the best way of randomly re-arranging a list of items in 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<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();

信用

您可以使用以線性時間運行的Fisher-Yates shuffle算法。

讓我指導你做一個錯誤的做法,以及我以前認可的方式,直到這篇博文發表之前從未見過它的錯誤:

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

我最喜歡的改組解決方案是使用N * log N sort並傳遞一個返回隨機結果的排序謂詞。 它具有很好的功能,可以使用最少的新代碼來完成,使用構建塊,即使是最條紋的版本,大多數語言都可以使用它。

我將創建一個新的列表,並用隨機選擇並從原始列表中刪除的項目填充它。

在這里試試這個代碼

它使用IComparer.Compare

如果使用泛型執行此功能,這將是一個很好的做法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM