C# 列表的随机元素<;T>;来自LINQSQL
我正在使用C# 列表的随机元素<;T>;来自LINQSQL,c#,.net,linq,random,C#,.net,Linq,Random,我正在使用C#3.5,目前正在使用Linq从用户表中获取所有用户,并将其放入列表中 现在我想从列表中返回一个随机用户。最好的方法是什么 编辑:在此处找到它: 像这样: var rand = new Random(); var user = users[rand.Next(users.Count)]; 像这样的怎么样 var users = GetUsers(); var count = user.Count(); var rand = new System.Random(); var rand
C#3.5
,目前正在使用Linq
从用户表中获取所有用户,并将其放入列表中
现在我想从列表中返回一个随机用户。最好的方法是什么
编辑:在此处找到它:
像这样:
var rand = new Random();
var user = users[rand.Next(users.Count)];
像这样的怎么样
var users = GetUsers();
var count = user.Count();
var rand = new System.Random();
var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();
使用:
对于实体框架或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
publicstatict随机化元素(此IQueryable q,表达式e)
{
var r=新的随机变量();
q=q,其中(e);
返回q.Skip(r.Next(q.Count()).FirstOrDefault();
}
//persons.RandomElement(p=>p.Age>18)返回一个+18岁的随机人
//RandomElement(p=>true)返回randomPerson,您可以编写一个重载版本,而不使用表达式参数
为什么不创建通用帮助程序和/或扩展名
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);
}
}
}
名称空间My.Core.Extensions
{
公共静态类枚举器
{
私有静态随机r;
静态枚举器()
{
r=新随机数();
}
公共静态T随机(IEnumerable输入)
{
返回input.ElementAt(r.Next(input.Count());
}
}
公共静态类EnumerableExtensions
{
公共静态T随机(此IEnumerable输入)
{
返回Enumerableholper.Random(输入);
}
}
}
用途如下:
var list = new List<int>() { 1, 2, 3, 4, 5 };
var output = list.Random();
var list=newlist(){1,2,3,4,5};
var输出=list.Random();
可以使用Random
类生成伪随机数。使用它在数组或列表的有效索引范围内生成一个随机数
Random rand = new Random();
var user = Users[rand.Next(Users.Count)];
如果您想看到更多示例,我创建了几个面向随机的LINQ扩展,并在文章中发布了它。并非完全适用于所有情况,但下面是一个替代解决方案,因为我已经在我的项目中使用过
List<User> myUserList = _context.Users.ToList();
var _faker = new Faker("en");
User randomUser = _faker.Random.ListItem<User>(myUserList);
List myUserList=\u context.Users.ToList();
var_faker=新的伪造者(“en”);
User randomUser=\u faker.Random.ListItem(myUserList);
如果它是一个IList
,则可能重复,您不需要LINQ。完全正确,但问题的措辞有很大的歧义空间。注意:在真实代码中var rand=new Random()
应该在其他地方初始化,这样它只能被播种一次。如果快速连续多次调用此代码,Random
的新实例可能最终使用相同的种子,从而在调用Next
时返回相同的值。实际上,此rand可能是静态的我相信users集合是零基数的,所以它应该是这样的:var user=users[rand.Next(users.Count-1)]@不需要罗马计数-1,rand.Next
“返回一个小于指定最大值的非负随机整数”
List<User> myUserList = _context.Users.ToList();
var _faker = new Faker("en");
User randomUser = _faker.Random.ListItem<User>(myUserList);