2015-04-15 5 views
0

Допустим, у нас есть этот массив:Как удалить конкретный объект из массива

Student[] students = new Student[3]; 
students[0] = new Student() { Number = 123, Name = "Jansen", Firstname = "Tom" }; 
students[1] = new Student() { Number = 456, Name = "Tomsen", Firstname = "Jan" }; 
students[2] = new Student() { Number = 789, Name = "Jackson", Firstname = "Ryan" }; 

Я хочу, чтобы удалить объект студента с номером 456, так что я называю мой метод:

RemoveStudentWithNumber(456); 

Это то, что я пробовал:

public void RemoveStudentWithNumber(int number) 
{ 
    for (int i = 0; i < students.Length; i++) 
    { 
     if (students[i].Number == number) 
     { 
      students[i] = null; 
     } 
    } 
} 

Это удаляет нужного ученика, но заменяет его пустой строкой в ​​массиве. Так что я действительно хочу уменьшить длину массива, когда метод вызывается правильно.

ответ

3

Array's in C# не может легко изменить свой размер - вам нужно создать новый массив.

В этой ситуации вам выгоднее использовать общий List.

var students = new List<Student>(); 
students.Add(new Student() { Number = 123, Name = "Jansen", Firstname = "Tom" }); 
students.Add(new Student() { Number = 456, Name = "Tomsen", Firstname = "Jan" }); 
students.Add(new Student() { Number = 789, Name = "Jackson", Firstname = "Ryan" }); 

, а затем

students.RemoveAt(/*index to remove*/); 

В качестве альтернативы можно использовать Linq, и создать новый массив:

students = students.Where(s = s.Number != number).ToArray(); 
+0

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

+0

Конечно, вы можете перемещать все последующие элементы массива один (который оставил бы пустую строку в конце, где она может остаться незамеченной), или вы можете создать новый массив, который имеет один элемент меньше и все копирует. Нет необходимости в списке, если это жесткое требование. –

+0

Хотя может быть невозможно изменить размер массива, можно приблизиться, используя метод «Изменить размер»: https://msdn.microsoft. ком/EN-US/библиотека/bb348051% 28В = vs.110% 29.aspx –

0

Вы могли бы преобразовать массив в ArrayList затем удалить элемент, как это :

System.Collections.ArrayList tempList = new System.Collections.ArrayList(); 
tempList.AddRange(students); 
tempList.RemoveAt(indexToRemove); 
students = tempList.ToArray(typeof(Student)) as Student[]; 

Yo u лучше не использовать обычный массив в этой ситуации.

0

Если вы не можете жить с пустой линией даже в конце, ср. мой комментарий к решению Дэйва, вы может впоследствии изменить размер массива так, чтобы он содержал один элемент меньше. Ср https://msdn.microsoft.com/en-us/library/bb348051%28v=vs.110%29.aspx.

функция может выглядеть следующим образом (непроверенные):

public void RemoveStudentWithNumber(int number) 
{ 
    for (int i = 0; i < students.Length; i++) 
    { 
     if (students[i].Number == number) 
     { 
      // move all subsequent students one down, 
      // closing the gap. 
      if(i != students.Length-1) 
      { 
       Array.Copy(students, i+1, students, i, students.Length-i-1); 
      } 
      // Now resize. 
      Array.Resize(ref students, students.Length-1); 
     } 
    } 
} 

Я бы также проверить, гарантируется ли, что условие прерывания от внешнего контура для вычисляется для каждого цикла, так как, возможно, students.Length изменений в петле. (Я думаю, все в порядке.)

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