Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表的随机元素<;T>;来自LINQSQL_C#_.net_Linq_Random - Fatal编程技术网

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