我想制作一个foreach循环,以便经常给游戏中的玩家提供金牌,我尝试了以下内容:
foreach (KeyValuePair<int, string> kVP in names)
{
player[kVP.Key].gold += 1;
continue;
}
但这并不是无限的。它实际上只给出1金,并停止。
如果有帮助,names
是Dictionary<int, string>
。
我确实意识到foreach循环永远不会停止,但它并没有给我任何金币。
注意:每个人,我看到我不应该使用foreach循环,但需要kVP.Key,因为它通过其id识别玩家,这是在玩家[]的[]中。我不知道如何在另一个循环中得到它
答案 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)
我认为你误解了foreach
和continue
。
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
循环旨在迭代具有有限数量元素的列表。你不希望它永远运行。为此,我们使用while
或do
循环。
可能不完全是你正在寻找的东西,但技术上可以让foreach永远运行。这可以通过编写无限的枚举器类来实现。然而,我会称之为有意构造丑陋的代码。