2012-04-09 74 views

回答

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

这不会溢出,在结束了吗?不应该是%List.Count() - 1? – 2012-04-09 03:47:44

+1

不要这么想......'m%p'会产生从'0'到'p-1'的值。 – Tenner 2012-04-09 03:49:08

+0

我认为,%将始终给出List.Count() - 1的最大余数,这将是最后一个元素。 – 2012-04-09 03:49:08

2
Random rnd = new Random(); 
var sequence = Enumerable.Range(1, 2).Select(n => lst[rnd.Next(0, lst.Count)]).ToList(); 
+0

不错,我不会用它..但真正可爱... +1 – gdoron 2012-04-09 03:53:14

0

你为什么要使用LINQ获得两个随机记录?

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

List有索引器属性,所以做List [index]并不昂贵。

保留简单。始终喜欢可读性。如果你让事情变得复杂,那么要维护你的代码的程序员将会很困难。

我只是好奇地想知道你为什么要这么做Linq?这对我来说似乎是一个开销。

我错过了什么?

+0

因为我想在我的网页上显示2条记录,每次回传后都会改变。所以我需要2从列表中获得2个随机记录 – Ali 2012-04-09 04:05:10

+0

我的问题是为什么LINQ? – Sandeep 2012-04-09 04:06:37

1

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

http://blogs.msdn.com/b/ericlippert/archive/2011/01/31/spot-the-defect-bad-comparisons-part-four.aspx – 2012-04-09 06:30:25

+0

什么?它是如何碰撞的? – AlfeG 2012-04-09 09:17:07

+1

根据使用的排序算法,这可能会导致无限循环(在时间t1时A> B,在时间t2时A 2012-04-09 09:32:40

相关问题