我们说我们有这个数组:
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" };
我想用Number 456删除学生对象,所以我打电话给我的方法:
RemoveStudentWithNumber(456);
这就是我的尝试:
public void RemoveStudentWithNumber(int number)
{
for (int i = 0; i < students.Length; i++)
{
if (students[i].Number == number)
{
students[i] = null;
}
}
}
这会删除正确的学生,但会用数组中的空行替换它。 所以我实际上想要在正确调用方法时减少数组的长度。
答案 0 :(得分:3)
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();
答案 1 :(得分:0)
您可以将数组转换为arraylist然后删除这样的项目:
System.Collections.ArrayList tempList = new System.Collections.ArrayList();
tempList.AddRange(students);
tempList.RemoveAt(indexToRemove);
students = tempList.ToArray(typeof(Student)) as Student[];
在这种情况下,最好不要使用普通数组。
答案 2 :(得分:0)
即使在最后你也不能忍受空行,参见我对Dave的解决方案的评论,你可以随后调整数组的大小,使其包含更少的元素。参看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);
}
}
}
我还要检查是否保证每个周期都会评估外部for循环的中止条件,因为student.Length可能会在循环中发生变化。 (我认为没问题。)