[英]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.