C# 如何使用Linq从列表中随机抽取两条记录?

C# 如何使用Linq从列表中随机抽取两条记录?,c#,linq,C#,Linq,如何使用Linq从列表中随机抽取两条记录?没有直接的方法。你可以试试这个,不过不好看 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(); 为什么要使用Linq获取两个随机记录 创建一个随机实例并

如何使用Linq从列表中随机抽取两条记录?

没有直接的方法。你可以试试这个,不过不好看

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

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

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

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

保持它的简单性。总是喜欢可读性。如果你只是把事情弄复杂了,那么维护你的代码的程序员将会有困难

我只是想知道你为什么要在Linq中这样做?这对我来说只是一笔开销


我错过什么了吗

对于
Linq to Objects
EF4
来说,这非常简单

db.Users.OrderBy(r => Guid.NewGuid()).Take(2)

对于
linqtosql
,您可以查看本文

将映射到SQL函数
NEWID
的函数随机添加到DataContext

partial class DataContext
{
    [Function(Name = "NEWID", IsComposable = true)]
    public Guid Random()
    {
        throw new NotImplementedException();
    }
}
用法


这就是最终对我起作用的原因,它确保不会返回任何副本:

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;
}
公共列表GetRandomItems(列表项,整数计数=3) { var length=items.Count(); var list=新列表(); var rnd=新随机数(); var-seed=0; while(list.Count()查看此帖子。。。[1] :这不是最后溢出来的吗?不应该是%List.Count()-1吗?我不这么认为
m%p
将生成从
0
p-1
的值。我认为,%将始终给出列表的最大余数。Count()-1是最后一个元素。您只取一个,应该取两个,这会增加列表中最后一项的几率。你的答案不够随机。我认为上面的逻辑可以增强,使用?操作人员我并不是说我有完美的答案。很好,我不会用它。。但是真的很可爱+1因为我想在我的页面上显示2条记录,这些记录在每次回发后都会更改。所以我需要2个从列表中获取2个随机记录,然后呢?它是如何碰撞的?这取决于所使用的排序算法,这可能会导致无限循环。(时间t1和A时A>B。)
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();
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;
}