我似乎无法找到我的代码的问题。可能是因为我太累了,但这让我疯了。
while循环工作并遍历整个集合并执行它必须执行的操作。 foreach循环也是如此,尽管我不确定创建列表的副本是否值得考虑。
for循环似乎是我继续前进的最佳选择,并在迭代它时更改集合的值。
问题是它总是太少于集合中的所有条目。 meal.count将在for循环结束时返回1。我做错了什么?
namespace HFCSExercise_Lumberjack
{
class Lumberjack
{
public string Name { get; private set; }
private Stack<Flapjack> meal;
public Lumberjack(string name)
{
Name = name;
meal = new Stack<Flapjack>();
}
public int FlapjackCount
{
get
{
return meal.Count;
}
}
public void TakeFlapjacks(Flapjack food, int howMany)
{
for(int i = 0; i < howMany; i++)
{
meal.Push(food);
}
}
public void EatFlapjacks()
{
//while(meal.Count > 0)
//{
// Console.WriteLine("Ed ate a {0} flapjack", meal.Pop().ToString().ToLower());
//}
for (int i = 0; i <= meal.Count; i++)
{
Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
}
//foreach (Flapjack x in meal.ToList())
//{
// Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
//}
}
}
}
答案 0 :(得分:2)
正如评论中所述,您的逻辑问题是每次使用meal.Count
时meal.Pop()
的值都会发生变化。请记住,pop正在从堆栈中删除一个项目。
for (int i = 0; i <= meal.Count; i++)
{
Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
}
因此,通过上面的循环,当你到达集合的中间(假装长度最初为10)时,你已经弹出了5个项目,长度现在是5,你从循环中断开而没有弹出另一个堆栈的一半。
这里更直观的构造是使用一段时间;
while (meal.Count > 0)
{
Console.WriteLine("{0} ate a {1} flapjack", Name, meal.Pop().ToString().ToLower());
}
Console.WriteLine("Now there are {0} items left!", meal.Count);
这将迭代整个堆栈,弹出每个项目并打印它。正如您所看到的,我添加的print语句将证明您已将所有项目弹出堆栈。