如何制作无限的foreach循环?

时间:2014-01-14 20:47:00

标签: c# foreach

我想制作一个foreach循环,以便经常给游戏中的玩家提供金牌,我尝试了以下内容:

foreach (KeyValuePair<int, string> kVP in names)
{
    player[kVP.Key].gold += 1;
    continue;
}

但这并不是无限的。它实际上只给出1金,并停止。

如果有帮助,namesDictionary<int, string>

我确实意识到foreach循环永远不会停止,但它并没有给我任何金币。

注意:每个人,我看到我不应该使用foreach循环,但需要kVP.Key,因为它通过其id识别玩家,这是在玩家[]的[]中。我不知道如何在另一个循环中得到它

7 个答案:

答案 0 :(得分:8)

你应该有一个游戏循环,它应该在游戏运行时运行。在该循环中,如果自上次执行此代码以来已经足够长(因为,可能,您不希望这次运行游戏循环的每次迭代,而是每次N次迭代),您将运行此代码。

当然continue;毫无意义,可以简单地删除。当到达身体的末端时,它已经知道进入下一次迭代;你不需要冗余地陈述这一点,而不是它真的伤害任何东西(超出可读性)。


当然,只是为了回答你提出的字面问题(即使它没有解决你的问题),这里有一个简单的扩展方法,你可以调用序列来无限重复:

public static IEnumerable<T> RepeatForever<T>(this IEnumerable<T> sequence)
{
    while (true)
        foreach (var item in sequence)
            yield return item;
}

因此允许你写:

foreach (KeyValuePair<int, string> kVP in names.RepeatForever())
{
    player[kVP.Key].gold += 1;
}

永远加入黄金。

答案 1 :(得分:3)

你无法进行无限foreach循环。 foreach专门用于遍历集合。

如果这不是你想要的,你就不应该使用foreach

答案 2 :(得分:2)

我认为你误解了foreachcontinue

foreach遍历序列;

foreach(var x in sequence)
{
    // ...
}

基本上是(给出或采取一些细节):

using(var iter = sequence.GetEnumerator())
{
    while(iter.MoveNext())
    {
        var x = iter.Current;
        // ...
    }
}

continue关键字只会跳转到下一个项目(如果有的话) - 即它会返回while,重新测试条件。

如果你想无限循环,那么:

  • 有一个无限循环(while(true)可以工作)
  • 有一个无限的序列(你可以foreach而不仅仅是集合)

答案 3 :(得分:1)

这是无限循环的一个例子:

while (true) {
    // code goes here. It will be run repeatedly, over and over, forever.
}

然而,如果你想要定期发生某些事情,那可能不是你想要的。这将立即发生,并且永远不会在while循环内完成代码运行。

答案 4 :(得分:0)

foreach循环不是这里使用的正确C#构造。根据定义,它将为它迭代的集合的每个元素运行一次。

您应该尝试使用以下方法之一:for(),while()或while {} while

答案 5 :(得分:0)

foreach用于浏览IEnumerable<>。如果您正在寻找无限循环,那么尝试使用while(Running) Running作为某种标志,最终可以终止循环。

我怀疑你想要过快地运行循环,否则你的玩家会太富有了!因此,您可能希望在循环中添加一个延迟,使其只运行一次。

while(Running)
{
  await Task.Delay(TimeBetweenGoldHandouts);

  foreach (KeyValuePair<int, string> kVP in names)
    player[kVP.Key].gold += 1;
}

注意

continue用于跳到循环的下一次迭代。因为你把它作为循环的最后一个条目,所以没有意义。

答案 6 :(得分:0)

foreach循环旨在迭代具有有限数量元素的列表。你不希望它永远运行。为此,我们使用whiledo循环。

可能不完全是你正在寻找的东西,但技术上可以让foreach永远运行。这可以通过编写无限的枚举器类来实现。然而,我会称之为有意构造丑陋的代码。