关于两个对象的比较

今天实现了一段代码,是将遍历pocUserArray(ArrayList)中的每个item,如果它不在pocUserInSeson(ArrayList)中,那么将它加到一个用户树结构中。第一次是这样实现的:
foreach  (PoCContactItem pocContactItem  in  Global.pocUserArray)
            
{
                
for (int i = 0; i < Global.pocUserInSesonArray.Count; i++)
                
{
                    
if (((PoCContactItem)Global.pocUserInSesonArray[i]).Equals(pocContactItem))
                    
{
                        isIn 
= true;
                    }

                }

                
if (!isIn)
                
{
                    treVwSelct.Nodes.Add(
new TreeNode(pocContactItem.GetUserName()));
                    treVwSelct.Nodes[userNumInSelct].ImageIndex 
= 0;
                    treVwSelct.Nodes[userNumInSelct].SelectedImageIndex 
= treVwSelct.Nodes[userNumInSelct].ImageIndex;
                    treVwSelct.Nodes[userNumInSelct].Tag 
= pocContactItem;
                    userNumInSelct
++;
                }

                isIn 
= false;
            }

发现((PoCContactItem)Global.pocUserInSesonArray[i]).Equals(pocContactItem)这个判断语句的结果总是false,说明这个判断语句是错误的,换了另外一种比较方式: pocContactItem == Global.pocUserInSesonArray[i] ,还是不对。

上网找了一下原因,原来操作符==()和实例的Equals()方法,对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference引用的时候才返回true。下面将具体的知识点记录在下:
/****************************************************************************************************/
Equals==ReferenceEquals 都可以用于判断两个对象的个体是不是相等。

a) ReferenceEquals
  ReferenceEquals是Object的静态方法,用于比较两个引用类型的对象是否是对于同一个对象的引用。对于值类型它总是返回false.
  
b) ==是一个可以重载的二元操作符,可以用于比较两个对象是否相等。
  对于内置值类型,==判断的是两个对象的代数值是否相等。它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。
  而对于用户定义的值类型,如果没有重载==操作符,==将是不能够使用的。
  对于引用类型,== 默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。但是.NET Framework中的类很多对==进行了重载,例如String类的==与Equals的行为相同,判断两个字符串的内容是否相等。所以在应用中,对于系统定义的引用类型建议不要使用==操作符,以免程序出现与预期不同的运行结果。
 
  c) Equals 作为Object内置方法,Equals支持对于任意两个CTS对象的比较。
  
  Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则 Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个 Reference的时候才返回true。可以根据需要对Equals进行重载。
/****************************************************************************************************/
知道了原因,问题很快就解决了,我为了简便没有重载Equals方法,而是自己编写了一个比较函数:

         public   static   bool  isEquals( object  left,  object  right)
        
{
            
if ((right == null)||(left == null))
                
return false;

            PoCContactItem leftPoC 
= (PoCContactItem)left;
            PoCContactItem rightPoC 
= (PoCContactItem)right;

            
if ((leftPoC.GetPresence() == rightPoC.GetPresence()) && (leftPoC.GetUserName() == rightPoC.GetUserName()) && (leftPoC.GetUserSipUri() == rightPoC.GetUserSipUri()))
                
return true;
            
return false;
        }
然后将 if  (((PoCContactItem)Global.pocUserInSesonArray[i]).Equals(pocContactItem))修改为if (isEquals(pocContactItem, Global.pocUserInSesonArray[i]))   ,问题解决。

ps:最上面的的遍历两个ArrayList的算法有点糙,感觉应该有更好看的方法,以后有时间优化一下。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值