2013-11-13 6 views
1

Я продолжаю получать исключение NullReferenceException, это была необработанная ошибка при попытке запустить этот код и не знаю почему. Я пытаюсь сортировать по имени человека Я работаю только с C# около 4 Мт.Проблемы с сортировкой пузырьков

public static student[] players = new student[30]; 
    public struct student 
    { 
     public string lastname; 
     public string firstname; 
     public string likes; 
    } 

    public static void read() 
    { 
     StreamReader sr = new StreamReader(@"names.txt"); 
     int i = 0; 
     while (!sr.EndOfStream) 
     { 
      players[i].lastname = sr.ReadLine(); 
      players[i].firstname = sr.ReadLine(); 
      players[i].likes = sr.ReadLine(); 
      i++; 
     } 
     sr.Close(); 
    } 

     public static void sort() 
     { 
      //alphabetically lists players 
      student temp; 

      for (int i = 0; i < players.Length - 1; i++) 
      { 
       for (int pos = 0; pos < players.Length - 1; pos++) 
       { 

        if (players[pos + 1].lastname.CompareTo(players[pos].lastname) < +0) 
        { 
         temp = players[pos + 1]; 
         players[pos + 1] = players[pos]; 
         players[pos] = temp; 
        } 
       } 
      } 

     } 
+0

Как вы заселяете массив игроков? Все элементы в массиве действительны? Пожалуйста, разместите свой код, в котором вы заполняете «игроков». – Baldrick

+0

Я представляю, что «игроки» - это статический массив «ученика», объявленный в определении класса. – Baldrick

+0

Создали ли вы новый экземпляр для «игроков»? – jhyap

ответ

1

Перед тем, как сравнить lastname, вам необходимо проверить элемент массива не null.

private static void Sort(Player[] players) 
{ 
    //alphabetically lists players 

    for (int i = 0; i < players.Length; i++) 
    for (int pos = 0; pos < players.Length - 1; pos++) 
    { 
     var currentPlayer = players[pos] != null ? players[pos].LastName : null; 
     var nextPlayer = players[pos + 1] != null ? players[pos + 1].LastName : null; 

     if (Compare(currentPlayer, nextPlayer) > 0) 
     { 
      var temp = players[pos + 1]; 
      players[pos + 1] = players[pos]; 
      players[pos] = temp; 
     } 
    } 
} 

private static int Compare<T>(T current, T next) 
    where T: IComparable 
{ 
    if (current == null) return -1; 
    if (next == null) return 1; 
    return current.CompareTo(next); 
} 
1

я бы поймал NullReference

while (!sr.EndOfStream) 
{ 
    player[i] = new student(); 
    players[i].lastname = sr.ReadLine(); 
    players[i].firstname = sr.ReadLine(); 
    players[i].likes = sr.ReadLine(); 
    i++; 
} 
+0

не может применять индексирование с [] к выражению – Kiwilad

+0

это сообщение об ошибке полученные при попытке игрока [i] [pos]? Потому что изначально, когда я вижу ваши циклы, я предполагал, что это был неровный массив. lol .. Так что, просто используйте плеер [pos], сделаете .. – jhyap

+0

да это ошибка – Kiwilad

0

Сортировка уже построен в рамках .NET с помощью Enumerable.OrderBy и EnumerableOrderByDescending. В вашем случае вы можете значительно уменьшить функцию:

public static IOrderedEnumerable<student> sort() 
{ 
    IOrderedEnumerable<student> orderedPlayers = players.OrderBy(p => p.lastname); 
    return orderedPlayers; 
} 

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

+1

Спасибо, что отсортировал его, каламбур lol – Kiwilad

+0

Ха-ха! Если я отвечу на ваш вопрос, отметьте, пожалуйста, ответ. Благодаря! –

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