先看个代码申明:
//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()函数就没问题了,请问是什么原因呢!在线等

解决方案 »

  1.   

    你想要实现的效果是什么?
    N个person对象是完全一样的吗?如:
    personList.Add(person);
    personList.Add(person);
    personList.Add(person);之间未对person有任何修改。
      

  2.   

    person对象里的各个属性不一样的
    我的 意思,在过后适合的时候把以前加入的某个person对象删除,可是就是不成功啊
      

  3.   

    InnerList的Remove方法的逻辑是把集合中的对象与参数对象进行比较,如果相等就删除。一般对象,如果没有重载Object.Equals方法,那么判断两个对象是否相等就是看着两个对象变量是否为同一个引用。楼主的问题可能就在于你后来要删除的对象,虽然其成员值和前面的一样,但是不是同一个引用,所以不能被Remove方法找到。为什么string对象可以呢,就是因为判断两个string是否相同时看其字符串的值而不是引用。楼主可以试试在PersonInfo中重载bool Equals(object)方法,当两个对象内部成员完全相等时返回true
      

  4.   

    To:hyena(hyena)
    你说的意思正是我想表达的意思,例如personList 里已经有个person对象了,而现在我把这个
    person对象再复制给另个person1:  person1 = person,那我现在通过这个person1把personList里person删除就不能成功了,原因可能就在于你所说的那样了,谢谢楼上的,也谢谢邻居,呵呵
    我再试试
      

  5.   

    To:hyena(hyena)
    我已经在尝试了,可惜我还是删除不了的啊 ,你能帮我把重载bool Equals(object)方法的大概代码贴出来吗?
      

  6.   

    class PersonInfo中重载bool Equals(object)方法public override bool Equals(object obj)
            {
                PersonInfo p = obj as PersonInfo;
                if (p == null) return false;
                return (this.ID == p.ID);
            }
      

  7.   

    PersonInfo person = new PersonInfo();
    ...//对person进行初始化,也就是这个对象里有数据了
    personList.Add(person);//有效果,成功的你new了几个PersonInfo就有几个,如果你只new一个,不管你Add几次,你那个容器里面也只有一个PersonInfo对象而已。先去理解引用类型,不管你怎么修改new出来的这个PersonInfo,实际上它只有一个实例而已,你每一次Add都是同一个实例就等于是废话,你的容器里面从始至终就只有一个person,你在外面修改person,也就是修改容器里面的那个person,person并没有增加。
      

  8.   

    现在程序执行成功了,谢谢cncxz,hyena(hyena),Ivony() ,有点我不太明白,就是为什么在
    personInfo类里重载 Equal()函数,而不是在PersonCollection:CollectionBase这个继承类里重载 Equal()函数呢,不说Remove方法的逻辑是把集合中的对象与参数对象进行比较,如果相等就删除,那也就是说把参数person  跟 (PersonCollection) personList里的对象集合比较么,那应该在这个类重载啊?本人比较古板,嘿嘿,帮忙解释下!
      

  9.   

    PersonCollection是比较的发起者,他怎么比呢?他拿出集合里面的一个实例A,告诉他,“和这个实例B比较一下,告诉我结果!”,翻译成C#语言就是
    bool compareResult = A.Equals(B);
    对于PersonCollectio来说,其实他根本用不着知道他集合内部都是些什么对象,他只要知道,要比较两个对象,就Call他们的Equals方法就可以了,需要知道如何进行比较的是集合里面的每个实例对象,
    所以,这就是为什么要重载PersonInfo的Equals方法的原因
    这其实是一种面向对象设计模式的典型应用
      

  10.   

    假设执行这么一个操作,要你看看某个人是否在某个房间里,在的话就叫他出来你觉得这个操作的核心是找人啊还是找房间呢? personList就是房间 ,person是人,要做的是看看房间里有没有你要找的人,换个说法就是挨个看看房间里的人,看是不是你要找的那个,所以落脚点还是在person上
      

  11.   

    原因如上所说。当然,如果你非要在Collection里面写Equals逻辑也是可以的,你可以遍历InnerList的元素,逐个的比较。另外,有一点非常要强调!!
    如果你重载了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();
    }
      

  12.   

    TO :hyena(hyena)
    我刚才稍微急了下,对不起!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    真的不好意思!!!!!!!
    我会记得你的帮助!!!下次补上!!!!
    谢谢!!!!!