[英]Clearing a list using a for loop
我正在制作二十一點游戲,在每個新回合開始時,我需要清除代表玩家和庄家的手牌的列表。 我這樣做是為了:
public void ClearPlayerHand()
{
for (int i = 0; i < PlayerHand.Count; ++i)
{
PlayerHand.Remove(PlayerHand[i]);
}
}
問題是,我總是似乎只剩下一張牌,或者無論如何更改i的值,我都會收到超出范圍的錯誤,從PlayerHand中刪除所有元素的最佳方法是什么?
如果您的集合PlayerHand
實現ICollection<T>
,則可以僅調用.Clear()
方法。
此接口的常見實現是List<T>
。
如果確實要通過for
循環清除List<T>
,則應使用反向for
循環。 這樣做的原因是,當您從列表中刪除一個項目時,它將使所有索引的下移位置,並且您很容易遇到超出范圍的異常。
例如:
for (int i = PlayerHand.Count - 1; i >= 0; i--)
{
PlayerHand.RemoveAt(i);
}
其他答案是正確的:使用Clear
。
但是,如果要通過循環和“ Remove
調用來執行此操作,請按以下步驟操作:
for(int i = PlayerHand.Count - 1; i >= 0; i--)
{
PlayerHand.RemoveAt(i);
}
反轉迭代的方向是真正的技巧。
這是最好/最簡單的方法。
PlayerHand.Clear();
超出范圍的原因
至於為什么收到超出范圍的異常,這是因為您要從列表中刪除元素而不斷增加計數。 您可能希望最后一個操作刪除i = 0
但它一直在計數。
假設PlayerHand中有3個項目,則會發生以下情況:
i = 0
remove PlayerHand[0] (it now contains 2 elements)
i = 1
remove PlayerHand[1] (it now contains 1 element)
i = 2
remove PlayerHand[2] (this throws an exception as only PlayerHand[0] exists)
在這種情況下,通常情況下您會倒數:
for (int i = PlayerHand.Count - 1; i >= 0; i--)
除了Clear
方法之外,另一種建議的方法是,您還可以使用RemoveAll
刪除全部或部分列表
// Remove all items
PlayerHand.RemoveAll(x => true);
// Remove part of list
PlayerHand.RemoveAll(x => ConditionMethod(x));
或者,您可以考慮使用數據綁定,然后應該更新ItemSource,而不是直接操作列表框或listview項。
List<T> SomeSource=...
PlayHand.ItemSource=SomeSource;
SomeSource.Clear();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.