我有一個包含所有用戶信息的對象列表。從列表中獲取隨機10個用戶數據mvc
List<UsrProfile> listUsr = GetAllUser();
在儀表板中,我必須從每個頁面刷新的列表中隨機顯示10個用戶配置文件。
我有一個包含所有用戶信息的對象列表。從列表中獲取隨機10個用戶數據mvc
List<UsrProfile> listUsr = GetAllUser();
在儀表板中,我必須從每個頁面刷新的列表中隨機顯示10個用戶配置文件。
這應該做你以後的事情: 它創建一個臨時列表,以確保你不會隨機選擇一個你已經選擇的重複,並且假設列表中至少有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--;
}
我更喜歡使用LINQ,簡短易讀。
var r = new Random();
var tenRandomUser = listUsr.OrderBy(u => r.Next()).Take(10);
這可行,但要小心。如果連續多次調用它(例如,在一個緊密的循環中),您可能會發現多次獲得相同的數字,因爲隨機數生成器使用相同的種子初始化。最好在構造函數中創建一個持久性的「隨機」實例,然後每次調用獲取隨機項的方法時使用它。 –
是的,也許'Random'的靜態實例會有所幫助 –
你可以通過兩種方式做到這一點(好吧,也許更多,但有兩個想到)。 一個是作爲@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的)解決方案隨機元素的數量之間的關係。
您可以使用下面的代碼行 -
listUsr.Take(10);
按隨機順序排序並取前十個值 – stuartd