2016-01-04 104 views

回答

0

這應該做你以後的事情: 它創建一個臨時列表,以確保你不會隨機選擇一個你已經選擇的重複,並且假設列表中至少有10個元素。

Random rnd = new Random(); 

var tempList = new List<User>(listUsr); 

int count = 10; 

while (count > 0) 
{ 
    int r = rnd.Next(tempList.Count); 
    // Do whatever with tempList[r] 
    templist.RemoveAt(r); 
    count--; 
} 
2

我更喜歡使用LINQ,簡短易讀。

var r = new Random(); 
var tenRandomUser = listUsr.OrderBy(u => r.Next()).Take(10); 
+0

這可行,但要小心。如果連續多次調用它(例如,在一個緊密的循環中),您可能會發現多次獲得相同的數字,因爲隨機數生成器使用相同的種子初始化。最好在構造函數中創建一個持久性的「隨機」實例,然後每次調用獲取隨機項的方法時使用它。 –

+0

是的,也許'Random'的靜態實例會有所幫助 –

1

你可以通過兩種方式做到這一點(好吧,也許更多,但有兩個想到)。 一個是作爲@wentimo描述。 其次是創建結果列表,並從源列表中隨機選擇並添加結果如果它不在那裏:

這應該做你以後的事情:它創建一個臨時列表以確保你不會隨機選擇您已經選擇了一個副本,並假定該列表至少包含10個元素。

Random rnd = new Random(); 
List<User> resultList = new List<User>(); 

while (resultList.Count < 10) 
{ 
    User u = listUsr[rnd.Next(listUsr.Count)]; 
    if (!resultList.Contains(u)) 
    { 
     resultList.Add(u); 
    } 
} 

什麼時候應該用哪種方式? 如果隨機元素的數量遠小於源列表中元素的數量,則使用第二種方法。例如,如果您選擇10萬個用戶中的10個,那麼很少有相同的用戶使用兩次,並且檢查結果列表是否包含元素對於少量元素來說是快速的。

另一方面,您正在避免再創建100,000個元素的列表。如果隨機元素的數量接近源元素的數量,則使用第一種方法,因爲您經常會選擇兩次或更多次相同的用戶,resultList將檢查是否存在大量元素。

另外,如果不知道源元件的數量和你想利用,選擇第一個(@ wentimo的)解決方案隨機元素的數量之間的關係。

-1

您可以使用下面的代碼行 -

listUsr.Take(10);