我如何使用Linq从列表中获取两个随机记录?

问题描述 投票:3回答:5

我如何使用Linq从列表中获取两个随机记录?

c# linq
5个回答
3
投票
Random rnd = new Random();
var sequence = Enumerable.Range(1, 2).Select(n => lst[rnd.Next(0, lst.Count)]).ToList();

2
投票

没有直接的方法。你可以尝试这个,但不是很漂亮。

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(); 

2
投票

对于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/

添加函数随机映射到SQL函数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();

0
投票

为什么要使用Linq获取两个随机记录?

创建一个Random实例并获取两个值小于列表长度的随机数。

List具有Indexer属性,因此执行List [index]并不昂贵。

把事情简单化。总是喜欢可读性。如果你只是让事情变得复杂,那么维护代码的程序员将会遇到困难。

我很想知道你为什么要在Linq做到这一点?这对我来说似乎只是一个开销。

我错过了什么吗?


0
投票

这最终为我工作,它确保没有返回重复:

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.