簡體   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