2013-03-21 2 views
0

Я делаю игру в Black Jack, и в начале каждого нового раунда мне нужно очистить список карт, которые представляют руки Игрока и Дилера. Я использовал это, чтобы сделать это:Очистка списка с помощью цикла for

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

Проблема я всегда, кажется, остается одна карта остается в списке, или я не получаю ошибку выхода за границы, независимо от того, как изменить значение I, то, является лучшим методом удаления всех элементов из PlayerHand?

+0

http://msdn.microsoft.com/en- us/library/dwb5h52a.aspx –

ответ

6

Если ваша коллекция PlayerHand реализует ICollection<T>, вы можете просто позвонить по методу .Clear().

Общая реализация этого интерфейса - List<T>.

Если вы хотите очистить List<T> через петлю for, вы должны использовать обратный цикл for. Причиной этого является то, что при удалении элемента из списка он сдвигает весь индекс вниз, и вы можете легко запускать исключения из индекса за пределы.

Примером этого может быть:

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

Действительно, и если это не так, возможно, это должно быть *. –

+0

Спасибо большое, только то, что мне нужно! [: –

+0

@JonDunn: Мое удовольствие :) –

1

Другой предлагаемый подход рядом Clear метод, вы можете также использовать RemoveAll либо удалить все или часть списка

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

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

Почему кто-то предпочитает это «Очистить»? –

+0

@CodyGray: Еще один вариант –

1

В качестве альтернативы, вы можете рассмотреть используя привязку данных, а затем вы должны обновлять ItemSource, а не напрямую манипулировать элементами списка или списка.

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

Другие ответы правильные: используйте Clear.

Но, если вы хотел сделать это с петлей и Remove вызовов, вот как бы это сделать:

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

реверса направление итерации реальный трюк.

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--) 
+0

Спасибо за помощь [: –

Смежные вопросы