先看个代码申明:
//PersonCollection
public class PersonCollection : CollectionBase
{
public void Add(PersonInfo person)
{
InnerList.Add(person);
} public void Remove(PersonInfo person)
{
InnerList.Remove(person);
}
}
//PersonInfo
public class PersonInfo
{
public string name;
public string tel;
public string adr;
public int ID;
public string sex;
}PersonCollection personList = new PersonCollection();
PersonInfo person = new PersonInfo();
...//对person进行初始化,也就是这个对象里有数据了
personList.Add(person);//有效果,成功的personList.Remove(person);//如果已经执行过上一句N次了,也就是说personList有好N个person,
//但是此句的作用的就是想删除一个person ,却无法实现,什么问题?如果把PersonInfo对象换成string 对象的话,Remove()函数就没问题了,请问是什么原因呢!在线等
//PersonCollection
public class PersonCollection : CollectionBase
{
public void Add(PersonInfo person)
{
InnerList.Add(person);
} public void Remove(PersonInfo person)
{
InnerList.Remove(person);
}
}
//PersonInfo
public class PersonInfo
{
public string name;
public string tel;
public string adr;
public int ID;
public string sex;
}PersonCollection personList = new PersonCollection();
PersonInfo person = new PersonInfo();
...//对person进行初始化,也就是这个对象里有数据了
personList.Add(person);//有效果,成功的personList.Remove(person);//如果已经执行过上一句N次了,也就是说personList有好N个person,
//但是此句的作用的就是想删除一个person ,却无法实现,什么问题?如果把PersonInfo对象换成string 对象的话,Remove()函数就没问题了,请问是什么原因呢!在线等
N个person对象是完全一样的吗?如:
personList.Add(person);
personList.Add(person);
personList.Add(person);之间未对person有任何修改。
我的 意思,在过后适合的时候把以前加入的某个person对象删除,可是就是不成功啊
你说的意思正是我想表达的意思,例如personList 里已经有个person对象了,而现在我把这个
person对象再复制给另个person1: person1 = person,那我现在通过这个person1把personList里person删除就不能成功了,原因可能就在于你所说的那样了,谢谢楼上的,也谢谢邻居,呵呵
我再试试
我已经在尝试了,可惜我还是删除不了的啊 ,你能帮我把重载bool Equals(object)方法的大概代码贴出来吗?
{
PersonInfo p = obj as PersonInfo;
if (p == null) return false;
return (this.ID == p.ID);
}
...//对person进行初始化,也就是这个对象里有数据了
personList.Add(person);//有效果,成功的你new了几个PersonInfo就有几个,如果你只new一个,不管你Add几次,你那个容器里面也只有一个PersonInfo对象而已。先去理解引用类型,不管你怎么修改new出来的这个PersonInfo,实际上它只有一个实例而已,你每一次Add都是同一个实例就等于是废话,你的容器里面从始至终就只有一个person,你在外面修改person,也就是修改容器里面的那个person,person并没有增加。
personInfo类里重载 Equal()函数,而不是在PersonCollection:CollectionBase这个继承类里重载 Equal()函数呢,不说Remove方法的逻辑是把集合中的对象与参数对象进行比较,如果相等就删除,那也就是说把参数person 跟 (PersonCollection) personList里的对象集合比较么,那应该在这个类重载啊?本人比较古板,嘿嘿,帮忙解释下!
bool compareResult = A.Equals(B);
对于PersonCollectio来说,其实他根本用不着知道他集合内部都是些什么对象,他只要知道,要比较两个对象,就Call他们的Equals方法就可以了,需要知道如何进行比较的是集合里面的每个实例对象,
所以,这就是为什么要重载PersonInfo的Equals方法的原因
这其实是一种面向对象设计模式的典型应用
如果你重载了Equals方法用于特殊目的,一定要同时重载GetHashCode方法。否则有些Dictionary会出问题。也就是说,如果你这样重载了Equals方法:public override bool Equals ( object obj )
{
MyClass _instance = obj as MyClass;
if ( _instance == null )
throw new ArgumentException();
return this._id == _instance._id;
}就要这样重载GetHashCode()
public override int GetHashCode()
{
return this._id.GetHashCode();
}
我刚才稍微急了下,对不起!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
真的不好意思!!!!!!!
我会记得你的帮助!!!下次补上!!!!
谢谢!!!!!