[英]How might I take two random records from a list using Linq?
我如何使用 Linq 從列表中取出兩條隨機記錄?
Random rnd = new Random();
var sequence = Enumerable.Range(1, 2).Select(n => lst[rnd.Next(0, lst.Count)]).ToList();
對於Linq-to-Objects
和EF4
,這非常簡單
db.Users.OrderBy(r => Guid.NewGuid()).Take(2)
對於Linq-to-SQL
可以查看這篇文章http://michaelmerrell.com/2010/03/randomize-result-orders-in-t-sql-and-linq-to-sql/
添加 function Random 映射到 SQL function NEWID
到 DataContext。
partial class DataContext
{
[Function(Name = "NEWID", IsComposable = true)]
public Guid Random()
{
throw new NotImplementedException();
}
}
用法
var qry = from row in DataBase.Customers
where row.IsActive
select row;
int count = qry.Count();
int index = new Random().Next(count);
Customer cust = qry.Skip(index).FirstOrDefault();
沒有直接的方法。 你可以試試這個,雖然不漂亮。
int randomRecord = new Random().Next() % List.Count(); //To make sure its valid index in list
var qData = List.Skip(randomRecord).Take(1);
var qValue = qData.ToList().First();
這就是最終對我有用的,它確保不返回重復項:
public List<T> GetRandomItems(List<T> items, int count = 3)
{
var length = items.Count();
var list = new List<T>();
var rnd = new Random();
var seed = 0;
while (list.Count() < count)
{
seed = rnd.Next(0, length);
if(!list.Contains(items[seed]))
list.Add(items[seed]);
}
return list;
}
為什么要用Linq得到兩條隨機記錄呢?
創建一個 Random 實例並獲得兩個值小於列表長度的隨機數。
List 具有 Indexer 屬性,因此執行 List[index] 並不昂貴。
保持簡單。 總是喜歡可讀性。 如果你只是讓事情變得復雜,那么將要維護你的代碼的程序員將很難過。
我只是想知道您為什么要在Linq中執行此操作? 這對我來說似乎是一種開銷。
我錯過了什么嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.