0

私はブラックジャックゲームを作っています。新しいラウンドの開始時に、プレーヤーとディーラーの手を表すカードのリストをクリアする必要があります。私はこれを使ってそうしました:

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

問題は、リストに1枚のカードが残っているように見えることです。または、iの値をどのように変更しても、範囲外のエラーが発生します。PlayerHandからすべての要素を削除する最良の方法は何ですか。

4

5 に答える 5

6

コレクションがPlayerHand実装されている場合は、メソッドICollection<T>を呼び出すだけです。.Clear()

このインターフェースの一般的な実装はですList<T>

List<T>viaループをクリアしたい場合はfor、逆forループを使用する必要があります。これは、リストからアイテムを削除すると、すべてのインデックスが1つ下にシフトし、インデックスの範囲外の例外が発生する可能性があるためです。

この例は次のとおりです。

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

他の答えは正しいです: use 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

または、リストボックスまたはリストビュー項目を直接操作する代わりに、データ バインディングの使用を検討してから、ItemSource を更新する必要があります。

List<T> SomeSource=...
PlayHand.ItemSource=SomeSource;
SomeSource.Clear();
于 2013-03-21T03:58:02.593 に答える
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 に答える