簡體   English   中英

我如何使用 Linq 從列表中取出兩條隨機記錄?

[英]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-ObjectsEF4 ,這非常簡單

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.

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