在c#中遍历队列并在每次迭代时出队。

4
我正在用C#构建一个控制台卡牌游戏。其中包括一个庄家和四个玩家,我想让庄家和每个玩家单独进行游戏。所以,我将这些玩家放入了一个队列(Queue)中,以便按顺序为他们服务。
我的问题是,在遍历队列中的所有玩家时,当运行我的逻辑(如下所示)时,for循环只会执行两次,因为playerQueue数量减少而i变量增加。
请帮助我找到一种纠正这种情况的方法。我尝试了使用while循环,但由于我们要操作 playerQueue.Count() ,它并没有起作用。
Queue<Player> playerQueue = new Queue<Player>();

int number_of_players = 4;


/// <summary>
///  Adds new player to Queue
/// </summary> 
for (int i = 0; i < number_of_players; i++)
{
    Player player = new Player();
    playerQueue.Enqueue(player);
}

/// <summary>
///  Get the first player in the playerQueue
/// </summary>  

// HERE IS THE PROBLEM
for (int i = 0; i < playerQueue.Count(); i++)
{ 
     System.Console.WriteLine(playerQueue.Count());
     System.Console.WriteLine(i);

     // Get the first player in the playerQueue 
     Player PlayerInGame = playerQueue.Dequeue();

    // Play the game with the current player in the queue
}

1
你只需要使用 foreach (Player playerInGame in playerQueue) 吗? - Elaskanator
2
while (playerQueue.Any()).. - TaW
1
@HABO,好的,太棒了。谢谢! - charles
1
@TaW 是的,那也起作用了,谢谢! - charles
1
@PiJei,在迭代队列时可以修改它。OP正在做这件事。但是需要小心进行操作,因为如果不小心就容易出现错误,而OP遇到的问题就是他们的迭代没有考虑到集合的变化。这并不意味着你不能这样做,只是需要正确编写迭代代码。 - Servy
显示剩余4条评论
1个回答

3
以下是我更新的代码库,使得for循环不再依赖于队列中的计数。相反,它有一个条件检查是否有人在等待。请参考下面的代码。
Queue<Player> playerQueue = new Queue<Player>();

int number_of_players = 4;


/// <summary>
///  Adds new player to Queue
/// </summary> 
for (int i = 0; i < number_of_players; i++)
{
    Player player = new Player();
    playerQueue.Enqueue(player);
}

/// <summary>
///  Get the first player in the playerQueue
/// </summary>  

// HERE IS THE SOLUTION
while(playerQueue.Any())
{ 
     System.Console.WriteLine(playerQueue.Count());
     System.Console.WriteLine(i);

     // Get the first player in the playerQueue 
     Player PlayerInGame = playerQueue.Dequeue();

    // Play the game with the current player in the queue
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接