[英]Remove object from List<> on condition
我正在创建一个蚂蚁模拟程序,使蚂蚁四处旅行并收集食物并将其带到巢中。 当从食物中收集到一定数量的蚂蚁时,我希望食物来源消失。 我有一个用于antObject,foodObject和nestObject的单独的类。
我的fixedFood类中有一个'int foodleft = 25'变量。 当用户单击时,食物对象将放置在屏幕上,并立即添加到列表对象“ foodList”。 draw方法绘制列表中的所有对象。 我无法弄清楚当'foodLeft'变量变为0时如何使特定食物对象消失!
这是我的fixedFood类中的绘制方法-
public void Draw(SpriteBatch spriteBatch, List<stationaryFood> foodlist)
{
foreach (stationaryFood food in foodlist)
{
spriteBatch.Draw(foodImage, foodBoundingRectangle, foodColor); //draw each food object in foodList
}
}
这是我尝试在update方法中的主“ game1”类中解决此问题的方法
if (foodList.Count > 0)
{
foreach (stationaryFood f in foodList)
{
if (f.FoodLeft == 0)
{
foodList.Remove(f);
}
}
}
但是,这不起作用! 我收到“未处理的无效操作错误”。
在我的主要game1类的draw方法中,我有这个
foreach (stationaryFood f in foodList)
{
f.Draw(spriteBatch, foodList);
}
有人可以看到我要去哪里错吗?
您在遍历集合时正在修改集合,因此为什么会遇到异常。 在您的情况下,请执行以下操作:
foreach (stationaryFood f in foodList)
{
if (f.FoodLeft == 0)
{
foodList.Remove(f);
}
}
而是这样做(假设它在XNA中可用):
foodList.RemoveAll(x => x.FoodLeft == 0)
如果不是,您可以查看此问题的答案以寻求替代方案。
乔治·霍华斯的答案将非常有效。
如果您对lambda表达式不满意,可以尝试反向迭代 :
foreach (stationaryFood f in foodList.Reverse<stationaryFood>())
{
if (f.FoodLeft == 0)
{
foodList.Remove(f);
}
}
反向迭代使我们可以遍历一个集合并同时删除项目。
前言:
游戏编程是开始使用C#的一种好方法,但是我建议您进一步阅读诸如for
, foreach
和语言约定之类的基本结构。
C#快速入门中的Microsoft Virtual Academcy Programming中的前五个模块将极大地增进您对该语言的理解。
回答:
我看foodlist
在stationaryFood
foodlist
类中使用foodlist
的原因。 这将绘制重叠的纹理,这毫无意义。
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(foodImage, foodBoundingRectangle, foodColor);
}
您可以创建一种从列表中删除项目的方法。
private void RemoveFood(List<stationaryFood> foodlist)
{
var foodToRemove = new List<stationaryFood>();
foreach(var f in foodlist)
{
if(f.FoodLeft == 0)
{
foodToRemove.Add(f);
}
}
foreach(var f in foodToRemove)
{
foodlist.Remove(f);
}
}
稍后,当您了解lambda时,可以将其简化为:
private void RemoveFood(List<stationaryFood> foodlist)
{
foodlist.RemoveAll(food => food.FoodList == 0);
}
您可以在Update
方法中添加它。
if (foodList.Count > 0)
{
RemoveFood(fooList);
}
并更改Draw
方法中的逻辑。
if (foodlist.Count > 0)
{
foreach(var f in foodlist)
{
f.Draw(spriteBatch);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.