我如何将其转换为返回多个项目
本文关键字:返回 项目 转换 | 更新日期: 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);
}
}