2015-01-31 3 views
0

В моей Toe игры Tic Tac Я массив объявлен следующим образом:Перебор массива C#

static char[] boardArray = new char[9]{ '0', '1', '2', '3', '4', '5', '6', '7', '8'}; 

И у меня есть

private static void resetBoard(ref char[] arr) 
{ 
for(int i = 0; i < 9; i++) { 
    arr[i] = (char)i; 
    } 
} 

Однако, когда я называю этот метод:

resetBoard(ref boardArray); 

Он устанавливает все значения массива в пустой символ. Почему это происходит?

+2

Предполагается, что это «новый символ [9] {...}'? – clcto

+0

Странно, что ваш boardArray имеет длину 5, а вы пытаетесь поместить внутри 9 элементов. – Mysterion

+4

@Mysterion: Я предполагаю, что OP напечатал это вместо копирования. Это может также объяснить загадочный 'b' после объявления массива. – siride

ответ

4

Я не устанавливаю их в пустые, но для значений ASCII 0-9, которые сильно отличаются от символов «0» - «9».

Что вы хотите:

for(int i = 0; i < arr.Length; i++) 
{ 
    arr[i] = (char)(i + '0'); 
} 

И кстати,

  • вам не нужно ref здесь, массивы являются ссылочными типами.
  • использованием arr.Length более разборчивыми и, вероятно, быстрее
+0

Не "ASCII", коды юникода. –

+0

То же, что и ASCII. Не будем путать вещи. –

+0

и используя 'arr.Length' уверяет, что вы не выходите за пределы arra – clcto

1

Несколько вещей, которые здесь происходит.

(1) Вам не нужно использовать ref. В любом случае массивы передаются по ссылке. Это означает, что любые изменения, которые вы производите в функции, которая принимает массив, будут очевидны вызывающей функции. Копия не сделана.

(2) Вы назначаете ASCII (на самом деле, Unicode, но здесь неактуальны) с 0 по 8 в ваш массив. Я предполагаю, что вам нужны фактические цифры, которые были бы чем-то другим. В этом случае, используйте этот код вместо, который преобразует число i в строку и получает первый символ этой строки (там будет только один персонаж так или иначе):

arr[i] = i.ToString()[0]; 

(3) Убедитесь в том, чтобы использовать arr.Length в вашем цикле for, так как он позволяет изменять размер массива без необходимости также обновлять код в вашем цикле for. В общем, избегайте констант, отличных от 0 и 1 в вашем коде (как и во всех правилах, существует множество исключений).

+0

Не "ASCII", коды кодов Unicode. –

+1

@ LasseV.Karlsen: это не имеет большого значения. – siride

+0

Downvoter помочь объяснить? – siride

1

Простой ответ, используйте arr[i] = char.Parse(i.ToString());, а не arr[i] = (char)i;.

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