簡體   English   中英

使用for循環清除清單

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM