2012-02-13 103 views
0

我有一個列表,可以有一個可變數量的項目(但不超過30個,所以沒有性能問題),我想獲得最多10個隨機項目,我寫了一段代碼,列表中有10多個項目。下面的代碼的問題是,如果列表中少於10個項目並且如果少於10個項目我想以隨機順序顯示它們,它顯然不會隨機化結果。如何從列表中獲得最多10個隨機項目?

var keyPersons = people.ToList(); 
Random rnd = new Random(); 
while (keyPersons.Count() > 10) 
{ 
    int j = rnd.Next(0, keyPersons.Count()); 
    keyPersons.RemoveAt(j); 
} 

rptKeyPersons.DataSource = keyPersons; 

如果在人員列表中只有5個項目,我該如何隨機化結果?

在此先感謝。

+2

您的代碼將刪除隨機點的物品,直到剩下10個物品。如果您的項目少於10個,那麼您最終只會列出已有的列表。那麼問題是什麼?你需要一個隨機*訂購*?在任何一種情況下,我都可能只是將名單洗牌並拿出前10項,顯然允許少於10項可能存在,根據你的規則聽起來很好。 – 2012-02-13 04:24:54

+0

是啊對不起,我更新了一些問題,如果有少於10我想他們都在隨機順序。 – user997685 2012-02-13 04:25:58

+0

用於洗牌列表:http://stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp – mshsayem 2012-02-13 04:30:13

回答

4

鑑於評論中的說明需要隨機排序,您可以對列表進行洗牌,然後按順序簡單取n項目。請注意,即使您的列表中有超過10個項目,您的方法仍然不包括隨機化這些結果,而是消除隨機點上的元素。剩下的元素仍然是原來的順序。這將解決這兩個問題。

鑑於

public static void Shuffle<T>(IList<T> list) 
{ 
    var random = new Random(); 
    for (int index = list.Count - 1; index >= 1; index--) 
    { 
     int other = random.Next(0, index + 1); 
     T temp = list[index]; 
     list[index] = list[other]; 
     list[other] = temp; 
    } 
} 

你可以有

var keyPersons = people.ToList(); 
Shuffle(keyPersons); 
rptKeyPersons.DataSource = keyPersons.Take(10); 

Take將選擇新鮮洗牌序列中的第10個項目。如果少於10個,則只需要儘可能多的數量。

0

我喜歡Anthonies解決方案,但它可以像這樣簡單。

var keyPersons = people.OrderBy(x => Guid.NewId()).ToList() 
rptKeyPersons.DataSource = keyPersons.Take(10); 
相關問題