2013-05-05 3 views
-3

В настоящее время я пытаюсь использовать массив строк заполняются значениями из класса B в классе А.Как использовать массив из другого класса?

Я попытался скопировать массив над как такового

string[] playerHand2 = new string[5]; 
Array.Copy(Deck.playerHand, playerHand2, 5); 

Однако я получаю пустую ссылку исключение, когда Я стараюсь, чтобы отобразить содержимое следующим образом:

Console.WriteLine("Players hand:"); 
foreach (var item in playerHand2) 
{ 
     Console.Write(item.ToString()); 
} 

Любой adive указал мне в правильном направлении очень ценится.

+1

Это похоже на простой случай, когда 'Deck.playerHand' не имеет того же количества элементов, что и' playerHand2', поэтому ваш левый с элементом «null». – James

+1

Вы заметили, что 'playerHand2' содержит только нули? – SimpleVar

+0

'class A' и' class B' не отображаются и, вероятно, не актуальны. –

ответ

1

Один из предметов в Deck.playerHand был уже нулевым.

Это нулевое значение копируется в playerHand2.

При повторении через playerHand2, null.ToString() вызывается, в результате чего вы получаете NullReferenceException.

Вы можете проверить на нулевое значение с:

bool hasNulls = Array.IndexOf(Deck.playerHand, null) > 0; 

или с помощью LINQ:

bool hasNulls = Deck.playerHand.Any(s => s == null); 
+0

Хорошо, спасибо, это означало бы, что у меня есть проблема в классе Deck, который мне нужно исправить – Skittle

+0

@Skittle: Правильно. Я обновил свой ответ, чтобы проверить, есть ли в вашей коллекции NULL. –

1

Следующий код работает прекрасно для меня:

string[] playerHand = new string[7] { "1", "2", "3", "4", "5", "6", "7" }; 
    string[] playerHand2 = new string[5]; 
    Array.Copy(playerHand, playerHand2, 5); 

    Console.WriteLine("Players hand:"); 
    foreach (var item in playerHand2) 
    { 
     Console.Write(item.ToString()); 
    } 

ли Вы, на самом деле заполнить ваш массив «playerHand» действительными данными? Else убедитесь, что у вас нет нулевых значений в массиве «playerHand», а размер «playerHand» должен быть как минимум равным «playerHand2».

Else вы можете просто избежать этого

foreach (var item in playerHand2) 
     { 
      if (string.IsNullOrEmpty(item)) { continue; } 
      Console.Write(item.ToString()); 
     } 
+0

Он появится в классе Deck, где я буду содержать исходный массив, который затем перетасовывается и разбивается, я сделал что-то неправильно и не заполнял playerHand. Спасибо, что я знаю, где моя проблема. – Skittle

1

Вам не нужно скопировать массив, чтобы использовать его, и преобразование строки в строку, не помогает.

Вы можете просто использовать:

foreach (var item in Deck.playerHand) 
{ 
    Console.WriteLine(item); 
} 

в общем, вы также можете перезаписать null с "", используя следующее:

for(int x = 0; x < Deck.playerHand.Length; x++) 
{ 
    if(Deck.playerHand[x] == null) 
    { 
     Deck.playerHand[x] = " "; 
    } 
} 

в сочетании, что дает следующий код:

for(int x = 0; x < Deck.playerHand.Length; x++) 
{ 
    if(Deck.playerHand[x] == null) 
    { 
     Deck.playerHand[x] = " "; 
    } 
    Console.WriteLine(Deck.playerHand[x]); 
} 

или даже более компактный, см. @saravanan:

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