0

我正在做一个黑杰克游戏,在每一轮新的开始时,我需要清除代表玩家和庄家手牌的卡片列表。我用这个来做到这一点:

public void ClearPlayerHand()
        {
            for (int i = 0; i < PlayerHand.Count; ++i) 
            {
                PlayerHand.Remove(PlayerHand[i]);
            }
        }

问题是我似乎总是在列表中留下一张牌,或者我收到越界错误,无论我如何更改 i 的值,从 PlayerHand 中删除所有元素的最佳方法是什么?

4

5 回答 5

6

如果您的集合PlayerHand实现ICollection<T>了您可以调用该.Clear()方法。

此接口的常见实现是List<T>.

如果您确实想List<T>通过for循环清除 a,则应使用反向for循环。这样做的原因是,当您从列表中删除一个项目时,它会将所有索引向下移动一个,并且您很容易遇到索引越界异常。

这方面的一个例子是:

        for (int i = PlayerHand.Count - 1; i >= 0; i--)
        {
            PlayerHand.RemoveAt(i);
        }
于 2013-03-21T03:52:14.527 回答
2

其他答案是正确的:使用Clear.

但是,如果您通过循环和Remove调用来执行此操作,您可以这样做:

for(int i = PlayerHand.Count - 1; i >= 0; i--)
{
  PlayerHand.RemoveAt(i);
}

反转迭代的方向是真正的技巧。

于 2013-03-21T03:59:42.120 回答
2

这是最好/最简单的方法。

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--) 
于 2013-03-21T03:59:52.513 回答
1

方法之外的另一种建议Clear方法,您也可以使用RemoveAll删除全部或部分列表

// Remove all items
PlayerHand.RemoveAll(x => true);

// Remove part of list
PlayerHand.RemoveAll(x => ConditionMethod(x));
于 2013-03-21T03:57:11.033 回答
1

或者,您可以考虑使用数据绑定,然后您应该更新 ItemSource,而不是直接操作列表框或列表视图项。

List<T> SomeSource=...
PlayHand.ItemSource=SomeSource;
SomeSource.Clear();
于 2013-03-21T03:58:02.593 回答