如何使用LINQ从IEnumerable中选择随机项目



我试图在C#中生成一个LINQ SELECT语句,从特定对象中选择随机项,而不是有序项。如何将以下语法转换为随机选择

random = _dbase.OrderBy(x => x.company).Take(1000);

不能从IEnumerable中选择随机项,因为它是一个生成值的生成器。它没有大小,所以您可能正在处理一个无限的IEnumerable,这使得无法选择随机项目。

解决方法是从初始集合中创建一个List<T>(它有一个大小(,然后选择一个随机项目。

IEnumerable<object> myCollection = ...;
var myList = myCollection.ToList();
var rng = new Random();
var randomIndex = rng.Next(0, myList.Count);
var randomItem = myList[randomIndex];

但在您的情况下,您不希望获取表中的所有数据。相反,您可以在sql请求中进行计算。

这里有一个链接显示如何做到这一点。

偷看以防无效

// DO NOT USE THIS FOR MORE THEN 100 ROWS
var randomRecord = foos.OrderBy( x=> SqlFunctions.Rand() ).FirstOrDefault();
// USE THIS FOR MORE THEN 100 ROWS
var random = Math.Random(foos.Count());
var randomRecord = foos.OrderBy( x=> x.id ).Skip( random ).FirstOrDefault();

最新更新