如何在while内停止循环

时间:2021-04-12 09:02:06

标签: c# unity3d

num_list = [1, 2]
alpha_list = ['a', 'b']
for i in range(len(num_list)):
    print(num_list[i])
    print(alpha_list[i])
    

如果我调用这个函数,我的电脑就死机了我做的不对,我只想在列表中添加 5 个新元素 gameManager.ActiveTasks.Dailytasks。谢谢!

1 个答案:

答案 0 :(得分:3)

问题

  • 一般来说,宁可使用 <= 5 ... 使用当前的 != 5 如果出于什么原因您的列表有 6 或更多元素 → 无限循环!< /strong>

  • 据我所知,您正在尝试迭代并将元素添加到 相同 集合!

    • 首先,无论如何这都会导致异常,因为不允许在迭代集合的同时修改它。

    • 其次它是空的! → foreach 中的代码从不执行 → 永远不会将任何内容添加到您的列表中 → 无限循环!

    我认为你想做的事情应该是这样的

     var alreadyAdded = false;
     foreach (Task i in gameManager.ActiveTasks.Dailytasks)
     {
         if (i == addingTask)
         {
             alreadyAdded = true;
             continue;
         }
     }
    
     if(!alreadyAdded)
     {
         gameManager.ActiveTasks.Dailytasks.Add(addingTask);
     }
    

    使用起来更容易

     if(!gameManager.ActiveTasks.Dailytasks.Contains(addingTask)) 
     {
         gameManager.ActiveTasks.Dailytasks.Add(addingTask);
     }
    
  • 即使它可以那样工作(或在前面提到的代码之后),如果没有足够的可用任务来获得 5 个独特的任务怎么办? → 再次无限循环


解决方案

看起来您想要实现的是拥有一个包含 5 random唯一 元素的列表,这些元素是从 {{1} 中的可用元素中挑选出来的}.

因此,您可能更喜欢使用 gameManager.TaskList 循环

  • 随机化可用任务列表
  • 依次选择其中的 5 个

你可以在一行中使用

  • Linq OrderByRandom.value 作为订单标准
  • 接着 Linq Take 从已经随机化的枚举中选择前 while 个项目 → 因为它们已经随机化,您现在可以按顺序进行

=> 您将获得 5 个随机的独特任务(或者,如果没有足够的可用任务,您只能获得现有数量 - 可以为 0)。

类似的东西

5