繁体   English   中英

在条件下从List <>中删除对象

[英]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#的一种好方法,但是我建议您进一步阅读诸如forforeach和语言约定之类的基本结构。

C#快速入门中的Microsoft Virtual Academcy Programming中的前五个模块将极大地增进您对该语言的理解。

回答:

我看foodliststationaryFood 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM