12

我有一个包含 x 数量用户的数据库,我想随机获取所有用户,然后在我的网站上写出 50 个用户。现在我只使用.take(50)和检索最新的 50 个用户。我希望它从整个桌子上随机洗牌 50 个,有什么想法吗?

这就是我的代码现在的样子:

userList = userList.OrderBy(user => -user.ID).Take(userCount).ToList();

注意: userlist是我的所有用户列表。正如你所看到的,我目前正在使用带有一个名为 userCount 的变量的 lambda,我说要列出多少用户!

4

5 回答 5

28

尝试这个

Random rnd = new Random();
userList = userList.OrderBy(user => rnd.Next()).Take(usercount).ToList();
于 2013-10-16T08:22:18.687 回答
0

有两种方法可以做到这一点,具体取决于系统中有多少用户

1.

List<int> ids = new List<int>(50);
int total = userList.Count();
Random r = new Random();
while (ids.Count() < 50)
{
    var next = r.Next(total);
    if (!ids.Contains(next))
        ids.Add(next);
}
var users = userList.Where(a => ids.Contains(a.ID));

2.

MikeSW 打败了我

选项之间的区别在于 1) 涉及对数据库的 2 个查询查询和 2) 涉及从数据库加载所有用户只是为了加载其中的 50 个。这取决于你,这是一种更好的方法。

于 2013-10-16T08:23:17.150 回答
0

当可以加载所有用户然后获取其中的 50 个用户时,您可以使用这样的 while 循环:

List<object> randomUsers = new List<User>();
Random r = new Random();
while (randomUsers.Count < 50)
{
    userList
      // skip previously selected users
      .Except(randomUsers)
      // random number to skip a random amount of users
      .Skip(r.Next(0, userList.Count() - 1 - randomUsers.Count))
      // and then take the next one
      .First();
}
于 2013-10-16T08:23:55.163 回答
0

假设您的实体中有一个 Id 主键列,我建议您使用以下查询,否则您将无缘无故地减少大量数据。

var rnd = new Random();

// Get the employeeIds.
var employeeIds = EmployeeService.Data()
    .Select(e => e.Id)
    .ToList();

// Choose n number of random employeeIds.
var randomEmployeeIds = employeeIds
    .OrderBy(id => rnd.Next())
    .Take(x);

// Get random employees.
var employees = EmployeeService.Data().Where(emp => randomEmployeeIds.Contains(emp.Id));
于 2014-06-10T08:50:50.713 回答
0

无随机扩展

public static class MyExtensions
{
    public static IEnumerable<T> GetRandomItems<T>(this IEnumerable<T> source, Int32 count)
    {
        return source.OrderBy(s => Guid.NewGuid()).Take(count);
    }
}

现在你可以

userList = userList.GetRandomItems().ToList();
于 2016-09-13T13:18:26.080 回答