给你的类重写Equals--检测Class是否相等

在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()来做判断的.看看下面的代码就明白:

 1 None.gif using  System;
 2 None.gif
 3 None.gif namespace  HashCode_Test
 4 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 5ExpandedSubBlockStart.gifContractedSubBlock.gif/**//// <summary>
 6InBlock.gif///        给你的类加入Equals,测试类
 7ExpandedSubBlockEnd.gif/// </summary>

 8InBlock.gifpublic class Class2
 9ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
10InBlock.gif    int myHashCode = 0;
11InBlock.gif    public Class2( int id )    //传递进一个int,作为GetHashCode的值
12ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
13InBlock.gif        myHashCode = id;
14ExpandedSubBlockEnd.gif    }

15InBlock.gif        
16InBlock.gif    //覆写GetHashCode,关键的一步
17InBlock.gif    public override int GetHashCode()    
18ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
19InBlock.gif        return myHashCode;
20ExpandedSubBlockEnd.gif    }

21InBlock.gif        
22InBlock.gif    //这步,可有可无,主要是做测试结果用的
23InBlock.gif    public override string ToString()    
24ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
25InBlock.gif        return DateTime.Now.ToString();
26ExpandedSubBlockEnd.gif    }

27InBlock.gif        
28ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
29InBlock.gif    ///        重载了Equals方法,这步和GetHashCode配合起来才会有效果
30InBlock.gif    /// </summary>
31InBlock.gif    /// <param name="o">要检测的对象</param>
32ExpandedSubBlockEnd.gif    /// <returns>返回是否相同</returns>

33InBlock.gif    public override bool Equals( object o )    
34ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
35InBlock.gif        return o.GetHashCode() == myHashCode;
36ExpandedSubBlockEnd.gif    }

37InBlock.gif
38InBlock.gif    //在这里使用运算符重载,主要是为了进一步演示Equals
39InBlock.gif    public static bool operator ==(object c1, Class2 c2) 
40ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
41InBlock.gif        return c1.GetHashCode().Equals( c2.GetHashCode() );
42ExpandedSubBlockEnd.gif    }

43InBlock.gif    
44InBlock.gif    //当你重载了==运算符后,必须要重载!=运算符
45InBlock.gif    public static bool operator !=(object c1, Class2 c2) 
46ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
47InBlock.gif        return c1.GetHashCode().Equals( c2.GetHashCode() );
48ExpandedSubBlockEnd.gif    }

49InBlock.gif        
50ExpandedSubBlockEnd.gif}

51ExpandedBlockEnd.gif}

这里是测试代码:

 1 None.gif System.Collections.ArrayList arr  =   new  System.Collections.ArrayList();
 2 None.gif
 3 None.gif int  i  =   0 ;
 4 ExpandedBlockStart.gifContractedBlock.gif for  ( i  =   0 ; i  <   4  ; i  ++  )  dot.gif {
 5InBlock.gif    Class2 class2 = new Class2(i);        //我们添加四个对象
 6InBlock.gif    arr.Add( class2 );
 7ExpandedBlockEnd.gif}

 8 None.gif
 9 None.gif for  ( i  =   0 ; i  <   4  ; i  ++  ) 
10 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
11InBlock.gif    Class2 class2 = new Class2(i);        //重新创建四个对象,判断是否和容器中的对象相等
12InBlock.gif    Console.WriteLine( i + ":" + arr.Contains(class2));//全部输出true
13ExpandedBlockEnd.gif}

14 None.gif
15 None.gif
16 None.gif
17 None.gifClass2 class2_1  =   new  Class2( 1 );     // 再创建对象1,并添加到容器中,以判断是否有多个对象1存在
18 None.gif arr.Add( class2_1  );                
19 None.gif
20 ExpandedBlockStart.gifContractedBlock.gif for  ( i  =   0 ;i < arr.Count;i ++   )  dot.gif {
21InBlock.gif    Class2 class2_3 = new Class2(1);//这个时候我们要检测出容器中有多少个对象1
22ExpandedSubBlockStart.gifContractedSubBlock.gif    if ( arr[i].Equals( class2_3 ) ) dot.gif{//我们用Equals来检测是否相等
23InBlock.gif        Console.WriteLine( "我用Equals找到\t"  );
24ExpandedSubBlockEnd.gif    }

25InBlock.gif    if ( arr[i] == class2_3  )            //我们用==来检测相等
26ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
27InBlock.gif        Console.WriteLine( "我用==找到\t"  );
28ExpandedSubBlockEnd.gif    }

29InBlock.gif    Console.WriteLine( arr[i].ToString() + "\t HashCode:" + arr[i] .GetHashCode());            //这里输出HashCode和ToString()查看
30InBlock.gif    
31ExpandedBlockEnd.gif}

32 None.gif


相信上面的代码很容易看的懂..在我的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是否关联??

转载于:https://www.cnblogs.com/lixianhuei/archive/2005/12/28/306336.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值