簡體   English   中英

C#從隊列中隨機選擇一個項目

[英]C# pick a random item from a Queue

我想知道是否有可能從隊列中獲取隨機項目?

Queue karten = new Queue();
        karten.Enqueue("Card 1");
        karten.Enqueue("Card 2");
        karten.Enqueue("Card 3");

        foreach(var x in karten)
        {
            Console.WriteLine(x);
        }

您從根本上缺少 OOP 的基礎知識:根據您的目的使用適當的數據類型,並且不要使事情復雜化。

List<string> list = new List<string>(); //this is an Array List
list.Add("One");
list.Add("Two");
list.Add("Three");

list.RemoveAt(new Random().Next(0, list.Length - 1));

如果您需要在任何地方訪問項目,則必須使用數組或數組支持的列表(如 C# List<T> ),它在訪問元素時具有 O(1) 復雜度,但在刪除時具有 O(n) . 一個鏈表有 O(n) 次訪問來查找一個元素,然后 O(1) 來刪除你剛剛找到的項目。

這意味着如果你使用一個數組,它需要一個常數時間來通過它的索引找到一個元素,但是你必須將隨后的元素移動一個位置。 相反,對於鏈表,如果您持有對要刪除項目的引用,刪除它需要恆定的時間。 當然,如果你只知道它的位置,首先需要 O(n) 才能找到正確的項目

這里我們使用隨機輸入來刪除項目。 在現實生活中,您會期望用戶輸入選擇要刪除的項目:因為這不在您的控制之下,這屬於random方法,其中 Array List 成功

您所描述的邏輯與隊列邏輯不匹配,排隊項目的排序是邏輯的基礎。

您可以對預期結果使用標准列表。

List<string> karten = new List<string>();
karten.Add("Karo 11");
karten.Add("Herz 2");
karten.Add("Herz König");
Random r = new Random();
    
while (karten.Count > 0)
{
    int i = r.Next(karten.Count - 1);
    Console.WriteLine(karten[i]);
    karten.RemoveAt(i);
}

暫無
暫無

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

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