2013-03-14 3 views
2

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

По какой-то причине он, по-видимому, сохраняет ссылку на значения, а не на сами значения. После сортировки табло читает «player 4 - score 4» для каждой записи. Я знаю, что метод сортировки работает, я использовал его ранее в другой игре.

Начальные значения player1 - 1 player2 - 2 player3 - 3 player4 - 4

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

, пожалуйста, помогите мне понять, почему это происходит. Я прочитал эту статью здесь, и это не помогло. http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

инициализации

ScoresList = DumpListToArray(PlayerManager.PlayerList); 

Update

SortKillScores(ScoresList); 

Draw

private static void DrawKillScores(SpriteBatch spriteBatch) 
    { 
     for (int i = 0; i < 4; i++) 
     { 
      spriteBatch.DrawString(font, "" + ScoresList[i].Name + " - " + ScoresList[i].KillScore, new Vector2(900, 0 + 20 * i), Color.White, 0f, Vector2.Zero, 0.5f, SpriteEffects.None, 1f); 
     } 

    } 

Методы

private static ScoreHolder[] DumpListToArray(List<Player> tempList) 
    { 
     ScoreHolder[] tempArray = new ScoreHolder[4]; 

     for (int i = 0; i < 4; i++) 
     { 
      tempArray[i] = new ScoreHolder(); 
      tempArray[i].Name = tempList[i].PlayerName; 
      tempArray[i].KillScore = tempList[i].KillScore; 
      tempArray[i].TimeScore = tempList[i].TimeScore; 
      tempArray[i].PointScore = tempList[i].PointScore; 
     } 

     return tempArray; 
    } 

    private static void SortKillScores(ScoreHolder[] array) 
    { 
     for (int i = 0; i < array.Length; i++) 
     { 
      for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--) 
      { 
       int score = array[k].KillScore; 
       string name = array[k].Name; 
       array[k] = array[k - 1]; 
       array[k - 1].KillScore = score; 
       array[k - 1].Name = name; 
      } 
     }  
    } 
+0

не могли бы вы выставить исходное сообщение для игрока, пожалуйста? – Dutts

+0

Пожалуйста, покажите код, в котором вы вызываете 'DumpListToArray' и' SortKillScores'. – Dai

+0

Вы используете 'ref' или' out' где-нибудь? Или вы сохраняете сам объект в памяти? Нам нужна дополнительная информация. – Greg

ответ

5

Вместо того, чтобы пытаться копировать свойства из одной ячейки в другую, просто поменять местами клетки:

private static void SortKillScores(ScoreHolder[] array) 
{ 
    for (int i = 0; i < array.Length; i++) 
    { 
     for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--) 
     { 
      var temp = array[k]; 
      array[k] = array[k - 1]; 
      array[k - 1] = temp; 
     } 
    }  
} 

Что ты копировал ссылку на тот же товар в array[k] и затем редактировать элемент в k-1 который является тот же товар!

int score = array[k].KillScore; 
string name = array[k].Name; 
array[k] = array[k - 1];   // cells k and k-1 are the same item! 
array[k - 1].KillScore = score; // this changes both k and k-1 
array[k - 1].Name = name;   // and so does this! 
+0

Благодарим за быстрый ответ! Кажется, это исправить! Хотя я до сих пор не понимаю, почему он будет вести себя так, когда я использовал его в прошлом, как без проблем? – Hardycore

1

@MattBurland кажется, покрывает вас здесь, но и расширить, если вы только пытаетесь разобраться, вы должны попробовать использовать метод OrderBy.

private static ScoreHolder[] SortKillScores(ScoreHolder[] array) 
{ 
    return array.OrderBy(e => e.KillScore); 
} 
+0

Вау, не знал, что это легко сортировать массив. Изменено несколько вещей сейчас, поэтому в обновлении у меня есть ScoresList = DumpListToScoreArray (PlayerManager.PlayerList); ScoresList = ScoresList.OrderBy (e => e.KillScore) .ToArray(); Вопрос: можете ли вы управлять восходящим/нисходящим? Если нет, я могу просто распечатать свой список в массиве в обратном порядке, без больших, просто любопытно. – Hardycore

+0

OrderBy (e => -e.KillScore) или OrderByDescending (e => e.KillScore) – Tar

+0

TY TAR! Хорошо знать! – Hardycore

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