【问题标题】:Random element of List<T> from LINQ SQL来自 LINQ SQL 的 List<T> 的随机元素
【发布时间】:2011-06-04 15:56:39
【问题描述】:

我正在使用C# 3.5,目前正在使用Linq 从用户表中获取所有用户并将它们放入列表中。

现在我想从该列表中返回一个随机用户。这样做的最佳方法是什么?

编辑:在这里找到它: How to get a Random Object using Linq

【问题讨论】:

标签: c# .net linq random


【解决方案1】:

并非完全适用于所有情况,但以下是我发现很方便的替代解决方案,因为我已经在我的项目中使用了Bogus

List<User> myUserList = _context.Users.ToList();

var _faker = new Faker("en");
User randomUser = _faker.Random.ListItem<User>(myUserList);

【讨论】:

    【解决方案2】:

    Random 类可用于生成伪随机数。使用它在数组或列表的有效索引范围内生成一个随机数。

    Random rand = new Random();
    var user = Users[rand.Next(Users.Count)];
    

    如果您想查看更多示例,我创建了几个面向随机的 LINQ 扩展并将其发布在文章 Extending LINQ with Random Operations 中。

    【讨论】:

      【解决方案3】:

      为什么不创建一个通用的帮助器和/或扩展?!

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

      【讨论】:

        【解决方案4】:

        对于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
        

        【讨论】:

          【解决方案5】:

          使用ElementAt:

          var rand = new Random();
          var user = users.ElementAt( rand.Next( users.Count() ) );
          

          【讨论】:

            【解决方案6】:

            这样的事情怎么样?

            var users = GetUsers();
            var count = user.Count();
            var rand = new System.Random();
            var randomUser = users.Skip(rand.Next(count)).FirstOrDefault();
            

            【讨论】:

            • 如果是IList&lt;T&gt;,则不需要LINQ。
            • 非常正确,但问题的表述方式存在很大的歧义。
            【解决方案7】:

            像这样:

            var rand = new Random();
            var user = users[rand.Next(users.Count)];
            

            【讨论】:

            • 注意:在实际代码中var rand = new Random(); 应该在其他地方初始化,这样它只会被播种一次。如果此代码被快速连续调用多次,Random 的新实例可能最终使用相同的种子,因此在调用Next 时返回相同的值。
            • 确实,这个兰特可能是static
            • 我相信 users 集合是零基数,所以应该是这样的: var user = users[rand.Next(users.Count-1)];
            • @Roman Count -1 不需要,rand.Next "返回一个小于指定最大值小于的非负随机整数"
            猜你喜欢
            • 2020-05-23
            • 1970-01-01
            • 1970-01-01
            • 2018-07-20
            • 2010-10-25
            • 2011-08-16
            • 2019-04-26
            • 1970-01-01
            相关资源
            最近更新 更多