如何从数组中删除特定对象

时间:2015-04-15 08:53:28

标签: c# arrays

我们说我们有这个数组:

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;
        }
    }
}

这会删除正确的学生,但会用数组中的空行替换它。 所以我实际上想要在正确调用方法时减少数组的长度。

3 个答案:

答案 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可能会在循环中发生变化。 (我认为没问题。)