我如何将其转换为返回多个项目

本文关键字:返回 项目 转换 | 更新日期: 2023-09-27 18:02:35

我有一个游戏列表,我需要随机选择这些游戏,下面的代码完全适用于1个游戏。

   var gameOfTheDay = games.AllActive[(int)(DateTime.Today.GetHashCode()) % games.AllActive.Count()]; 

我需要的是返回多于1个游戏,随机的,基于X (X在上面的情况下是星期几,我将把它改为一个特定的字符串)

我需要这个来创建项目的半随机生成。

半-因为我想给它一个关键字,并得到相同的结果

随机-因为我需要使游戏列表随机

例如,每次你输入标题为"hello"的页面,你会看到相同的游戏,这些游戏是根据关键字"hello"从游戏列表中专门为该关键字选择的。

以同样的方式gameOfTheDay的工作

我如何将其转换为返回多个项目

您可以使用LINQ:

int limit = 10;
string keyword = "foo";
Random rng = new Random(keyword.GetHashCode());
var gamesOfTheDay = games.OrderBy(x => rng.Next()).Take(limit);

然而,这会给排序带来一些开销。如果与你选择的游戏数量相比,你有很多游戏,那么排序可能会太昂贵,而且在发生碰撞时,只要重新尝试就足够安全,那么手动排序可能会更快:

HashSet<Game> gamesOfTheDay = new HashSet<Game>();
while(gamesOfTheDay.Count < limit && gamesOfTheDay.Count < games.Length)
{
    int idx = rng.Next(games.Length);
    gamesOfTheDay.Add(games[idx]);
}

请注意,在任何情况下,Random都是用依赖于关键字的种子构造的,因此该关键字的顺序每次都是相同的。您也可以类似地将当前DateTime和关键字的散列组合起来,以获得该日期的唯一随机序列——关键字组合。

使用与您现在所拥有的类似的代码随机添加游戏到游戏列表中(最初将为空)-如果游戏已经在列表中,则不要添加它。

当列表大小合适时停止。

未测试的代码:

var rand = new Random();
var randomGames = new List<game>();
while(randomGames.Count < limit)
{
   var aGame = games.AllActive[rand.Next(limit)];
   if (!randomGames.Contains(aGame))
   {
      randomGames.Add(aGame);
   }
}