【发布时间】:2011-06-04 15:56:39
【问题描述】:
我正在使用C# 3.5,目前正在使用Linq 从用户表中获取所有用户并将它们放入列表中。
现在我想从该列表中返回一个随机用户。这样做的最佳方法是什么?
编辑:在这里找到它: How to get a Random Object using Linq
【问题讨论】:
我正在使用C# 3.5,目前正在使用Linq 从用户表中获取所有用户并将它们放入列表中。
现在我想从该列表中返回一个随机用户。这样做的最佳方法是什么?
编辑:在这里找到它: How to get a Random Object using Linq
【问题讨论】:
并非完全适用于所有情况,但以下是我发现很方便的替代解决方案,因为我已经在我的项目中使用了Bogus。
List<User> myUserList = _context.Users.ToList();
var _faker = new Faker("en");
User randomUser = _faker.Random.ListItem<User>(myUserList);
【讨论】:
Random 类可用于生成伪随机数。使用它在数组或列表的有效索引范围内生成一个随机数。
Random rand = new Random();
var user = Users[rand.Next(Users.Count)];
如果您想查看更多示例,我创建了几个面向随机的 LINQ 扩展并将其发布在文章 Extending LINQ with Random Operations 中。
【讨论】:
为什么不创建一个通用的帮助器和/或扩展?!
namespace My.Core.Extensions
{
public static class EnumerableHelper<E>
{
private static Random r;
static EnumerableHelper()
{
r = new Random();
}
public static T Random<T>(IEnumerable<T> input)
{
return input.ElementAt(r.Next(input.Count()));
}
}
public static class EnumerableExtensions
{
public static T Random<T>(this IEnumerable<T> input)
{
return EnumerableHelper<T>.Random(input);
}
}
}
用法是:
var list = new List<int>() { 1, 2, 3, 4, 5 };
var output = list.Random();
【讨论】:
对于Entity Framework或者Linq 2 Sql,可以使用这个扩展方法
public static T RandomElement<T>(this IQueryable<T> q, Expression<Func<T,bool>> e)
{
var r = new Random();
q = q.Where(e);
return q.Skip(r.Next(q.Count())).FirstOrDefault();
}
// persons.RandomElement(p=>p.Age > 18) return a random person who +18 years old
// persons.RandomElement(p=>true) return random person, you can write an overloaded version with no expression parameter
【讨论】:
使用ElementAt:
var rand = new Random();
var user = users.ElementAt( rand.Next( users.Count() ) );
【讨论】:
这样的事情怎么样?
var users = GetUsers();
var count = user.Count();
var rand = new System.Random();
var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();
【讨论】:
IList<T>,则不需要LINQ。
像这样:
var rand = new Random();
var user = users[rand.Next(users.Count)];
【讨论】:
var rand = new Random(); 应该在其他地方初始化,这样它只会被播种一次。如果此代码被快速连续调用多次,Random 的新实例可能最终使用相同的种子,因此在调用Next 时返回相同的值。
static
rand.Next "返回一个小于指定最大值小于的非负随机整数"