给你的类重写Equals--检测Class是否相等
2005-12-28 10:35
260 查看
在C#的容器中,常用的三个容器数组,ArrayList,Hashtable..数组比较简单,实现某种单一数据的存储,但是并不能自由插入,移除和容纳不同的对象..,所以ArrayList是数组的替代品,并且由于ArrayList可以自由的添加,删除,插入,读取,给我们提供了足够大的自由性,颇得我的青睐..不过使用中,难免有些缺点,感觉最麻烦的就是检测某对象是否在Items中..因为每一个new出来的Class在内存中的表现不相同,即便是同一个类,你new出来两个,然后再判断,也是会一样的!!所以每次使用ArrayList.Contains()检测对象的时候,难免都得不到自己想要的结果..因为每个Class都是继承自Object类..而ArrayList.Contains()的实现是IList.Contains,而此方法是调用Class中的Equals方法判断是否相等,这个时候,可以在自己的对象中覆写Object.Equals方法,以达到自己的目的..注意,如果你覆写了Equals方法,则也要覆写GetHashCode(),因为Equals是用获取Object.GetHashCode()来做判断的.看看下面的代码就明白:
1using System;
2
3namespace HashCode_Test
4System.Collections.ArrayList arr = new System.Collections.ArrayList();
2
3int i = 0;
4
9for ( i = 0; i < 4 ; i ++ )
10
15
16
17Class2 class2_1 = new Class2(1); //再创建对象1,并添加到容器中,以判断是否有多个对象1存在
18arr.Add( class2_1 );
19
20
相信上面的代码很容易看的懂..在我的Class2类中覆写了GetHashCode() ,ToString() ,Equals(object o),并重载了==运算符和!=运算符..将传递的id作为HashCode,然后判断当前传递的对象Object.GetHashCode是否等于当前对象的GetHashCode..这样就解决了ArrayList.Contains不能对Class做出正确判断的问题..
另外,还有一个容器Hashtable的使用和判断,并不能用上面的方法解决..因为Hashtable.Contains的实现方法是IDictionary.Contains来做判断..需要实现IDictionary接口的方法才可以.因为牵涉到的内容比较多.所以不能在这里全部写完..关于具体的方法和实现,我会找时间写出来的..
最后大家可以自己做一个没有实现Equals方法的类,再用ArrayList.Contains来做判断..可以看到结果都是flase..和上面的代码是个对比..
这个方法不仅可以用在ArrayList,而且也可以在多个地方使用,比如两个Class之间的关联?Class1和Class2是否关联??
1using System;
2
3namespace HashCode_Test
4System.Collections.ArrayList arr = new System.Collections.ArrayList();
2
3int i = 0;
4
9for ( i = 0; i < 4 ; i ++ )
10
15
16
17Class2 class2_1 = new Class2(1); //再创建对象1,并添加到容器中,以判断是否有多个对象1存在
18arr.Add( class2_1 );
19
20
相信上面的代码很容易看的懂..在我的Class2类中覆写了GetHashCode() ,ToString() ,Equals(object o),并重载了==运算符和!=运算符..将传递的id作为HashCode,然后判断当前传递的对象Object.GetHashCode是否等于当前对象的GetHashCode..这样就解决了ArrayList.Contains不能对Class做出正确判断的问题..
另外,还有一个容器Hashtable的使用和判断,并不能用上面的方法解决..因为Hashtable.Contains的实现方法是IDictionary.Contains来做判断..需要实现IDictionary接口的方法才可以.因为牵涉到的内容比较多.所以不能在这里全部写完..关于具体的方法和实现,我会找时间写出来的..
最后大家可以自己做一个没有实现Equals方法的类,再用ArrayList.Contains来做判断..可以看到结果都是flase..和上面的代码是个对比..
这个方法不仅可以用在ArrayList,而且也可以在多个地方使用,比如两个Class之间的关联?Class1和Class2是否关联??
相关文章推荐
- 给你的类重写Equals--检测Class是否相等
- 给你的类重写Equals--检测Class是否相等
- instanceof、isInstance、==、equals判断Class是否相等
- 正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素
- HashSet 重写类的equals方法可以根据类的关键字段判断是否相等
- 比较两个对象的内容是否相等 重写object 的equals方法
- 重写equals方法判断类的值是否相等
- 判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
- 判断对象是否相等---重写equals方法
- 检测Class是否相等
- 判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
- C#检测两个矩阵是否相等的方法
- 判断 tableview class 是否相等
- 重写equals方法之后,是否需要重写hashCode方法
- iOS判断对象相等 重写isEqual、isEqualToClass、hash
- 检测字符串是否相等
- [置顶] 判断两个对象是否相等,hashcode和equals方法的联系
- 第2章 Java编程基础——FAQ2.21 ==和equals()都可用于比较两个操作数是否相等, 它们有什么区别吗?
- toCharArray()方法 和 Java中比较两个字符串是否相等equals方法
- JAVA学习【12】“==”、“equals”判断包装类是否相等