I am trying to remove an object from an ArrayList and here is the code
Read re = new Read(connectionString);
List<Student> arcurrentCuourseStudnets= re.currentCourseStudents(); //Reading the students in this course it is return ArrayList with the IDs of all students in this course
List<Student> arstuedents=new List<Student>();
foreach (object ob1 in arcurrentCuourseStudnets)
{
arstuedents.Add(re.student(((currentCourseStudents)ob1).StudentID.ToString()));//return the student as object indicates its ID FirstName ....
}
listBoxSS.Items.Clear();
Read search = new Read(connectionString);
List<Student> arr = search.students();//Read all the students in DB
foreach (object ob in arstuedents)
{
arr.Remove(ob); //remove the Current Course Students from the List to prevent the duplicate's
}
this arr.Remove() doesn’t work even when I try to do the following arr[0].Equals(arstuedents[0]); it gives false every time I look to the values and IDs for the students of arr[0] and arstuedents[0] I found it the same but it gives false
foreach (object o in arr)
{
listBoxSS.Items.Add((Student)o);
}
What is the problem and why does the compiler not see it as equal?
//I did the following things
public class Student : IEqualityComparer<Student>
{
int student_id;
string first_name;
string last_name;
string mother_name;
string father_name;
DateTime birth_date;
string education_level;
string address;
string notes;
int[] phones;
public Student(string first_name, string last_name, string mother_name, string father_name, DateTime birth_date, string education_level, string address, string notes)
{
this.first_name = first_name;
this.last_name = last_name;
this.mother_name = mother_name;
this.father_name = father_name;
this.birth_date = birth_date;
this.education_level = education_level;
this.address = address;
this.notes = notes;
}
public Student(int student_id, string first_name, string last_name, string mother_name, string father_name, DateTime birth_date, string education_level, string address, string notes)
{
this.first_name = first_name;
this.last_name = last_name;
this.mother_name = mother_name;
this.father_name = father_name;
this.birth_date = birth_date;
this.education_level = education_level;
this.address = address;
this.notes = notes;
this.student_id = student_id;
}
public int Student_id
{ get { return student_id; } }
public string First_name
{
get
{ return first_name; }
set
{ first_name = value; }
}
public string Last_name
{
get
{ return last_name; }
set
{ last_name = value; }
}
public string Mother_name
{
get { return mother_name; }
set
{ mother_name = value; }
}
public string Father_name
{
get { return father_name; }
set
{ mother_name = value; }
}
public DateTime Birth_date
{
get { return birth_date; }
set
{ birth_date = value; }
}
public string Education_level
{
get { return education_level; }
set
{ education_level = value; }
}
public string Address
{
get { return address; }
set
{ education_level = value; }
}
public string Notes
{
get { return notes; }
set
{ notes = value; }
}
public int[] Phones
{
get { return phones; }
set { phones = value; }
}
public override string ToString()
{
if (phones != null && phones[0] != 0)
return first_name.PadRight(30, ' ') + father_name.PadRight(30, ' ') + last_name.PadRight(30, ' ') + phones[0].ToString();
else
return first_name.PadRight(30, ' ') + father_name.PadRight(30, ' ') + last_name;
}
public bool Equals(Student x, Student y)
{
return (x.Student_id == y.Student_id);
}
public int GetHashCode(Student obj)
{
return obj.GetHashCode();
}
}
//is that what you mean?
By default, the
Removemethod will only remove the exact instance being passed in. It will not remove another instance of the same type that just happens to be populated with the same values. Therefore, unlesssearch.studentsreturns the same instances of the objects asre.currentCourseStudents, it will never find a match and remove it.Either you need to search through
arrfor matches based on some unique property value and then remove it, or you will need to override the Equals method on that type (whatever type the objects are that are in that list). I say this because according to the MSDN, theArrayList.Removemethod usesObject.Equalsto determin equality:http://msdn.microsoft.com/en-us/library/system.collections.arraylist.remove.aspx
For instance, if the objects are all
Studentobjects, in yourStudentclass, you would need to override theEqualsmethod, as such:Also, I would feel I have failed you in some way if I didn’t mention the fact that the use of
ArrayListshould be discouraged. If the lists contain onlyStudentobjects, then you should be usingList<Student>or some other type-specific collection, if possible.However, if your
Studentclass inherits from a base class that seals theEqualsmethod, such asDependencyObject, then you will not be able to override the equality check and therefore you must use a different type of list which checks for equality in a different way. If you choose to use theList<Student>type of list, itsRemovemethod checks your objects for equality usingIEquatable: