我正在制作一个黑杰克游戏,并且在每一轮新游戏开始时我需要清除代表玩家和经销商手牌的牌。我用它来做到这一点:
public void ClearPlayerHand()
{
for (int i = 0; i < PlayerHand.Count; ++i)
{
PlayerHand.Remove(PlayerHand[i]);
}
}
问题是我似乎总是在列表中留下一张卡片,或者我收到一个越界错误,无论我如何更改i的值,删除所有元素的最佳方法是什么PlayerHand?
答案 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();