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

时间:2011-07-13 13:56:26

标签: c# list random

我有一个游戏列表,我需要随机选择,到星期几, 以下代码适用于1个游戏。

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

我需要的是返回超过1个游戏,随机化,基于X(上面的例子中的X是星期几,我会将其更改为特定的字符串)

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

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

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

例如,每当您输入标题为“hello”的Page时,您将看到相同的游戏,这些游戏是根据关键字“hello”从游戏列表中专门为该关键字选择的。

以同样的方式游戏TheDay Works。

2 个答案:

答案 0 :(得分:1)

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

当列表大小合适时停止。

未经测试的代码:

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

答案 1 :(得分:1)

您可以使用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和关键字的哈希值,以获得该日期关键字组合的唯一随机序列。