【问题标题】:Select single random item from list of items [duplicate]从项目列表中选择单个随机项目[重复]
【发布时间】:2012-07-24 16:38:11
【问题描述】:

我有一个返回结果列表的查询。我想要该列表中的一个随机项目。

var query = (from...
            where...
            select q).Random(1); //Something like this?

如何做到这一点?假设有 1 个项目我希望选择该项目。如果还有更多,那么我希望以随机顺序选择其中一个。

【问题讨论】:

    标签: linq linq-to-sql random


    【解决方案1】:
    var query = (from...
                where...
                orderby Guid.NewGuid()
                select q).First();
    

    【讨论】:

      【解决方案2】:

      您可以将Randomize a List in C# 中发布的Shuffle 示例与LINQ Take 方法结合使用在IList<T> 上创建扩展方法,您需要在调用@ 之前ToList 您的选择987654327@,除非您将其移到扩展程序中。

      public static List<T> Random<T>(this IList<T> list, int takeNumber)
      {
          return list.Shuffle().Take(takeNumber);
      }
      
      public static List<T> Shuffle<T>(this IList<T> list)  
      {  
          Random rng = new Random();  
          int n = list.Count;  
          while (n > 1) {  
              n--;  
              int k = rng.Next(n + 1);  
              T value = list[k];  
              list[k] = list[n];  
              list[n] = value;  
          }
      
          return list;
      }
      

      【讨论】:

      • 这将在客户端而不是在 SQL 中执行。
      【解决方案3】:

      这种随机播放方法比其他答案更好。链接时不会产生任何性能问题,而且它仍然是 LINQ。

      public static IEnumerable<T> TakeRandom<T>(this IEnumerable<T> source, int count)
      {
          return source.Shuffle().Take(count);
      }
      
      public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
      {
          return source.OrderBy(x => Guid.NewGuid());
      }
      

      用法:

      var query = (from...
              where...
              select q).TakeRandom(1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 2021-11-17
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多