使用for循环清除列表

时间:2013-03-21 03:50:49

标签: c#

我正在制作一个黑杰克游戏,并且在每一轮新游戏开始时我需要清除代表玩家和经销商手牌的牌。我用它来做到这一点:

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

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

5 个答案:

答案 0 :(得分:6)

如果您的收藏集PlayerHand实施ICollection<T>,您只需拨打.Clear()方法。

此界面的常见实现是List<T>

如果您确实希望通过List<T>循环清除for,则应使用反向for循环。这样做的原因是,当您从列表中删除一个项目时,它会将所有索引向下移动一个,并且您可以轻松地进入索引超出范围的异常。

这方面的一个例子是:

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

答案 1 :(得分:2)

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

但是,如果您想要通过循环和Remove调用执行此操作,请按以下步骤操作:

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

反转迭代的方向是真正的伎俩。

答案 2 :(得分:2)

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

PlayerHand.Clear();

越界原因

至于为什么你收到越界异常,它正在发生,因为你要从列表中删除元素但不断计算。您希望最后一个操作删除i = 0,但它会继续计数。

Say 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--) 

答案 3 :(得分:1)

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

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

// Remove part of list
PlayerHand.RemoveAll(x => ConditionMethod(x));

答案 4 :(得分:1)

或者,你可以考虑使用数据绑定,然后你应该更新ItemSsource,而不是直接操作listbox或listview项。

List<T> SomeSource=...
PlayHand.ItemSource=SomeSource;
SomeSource.Clear();