{
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方法,而是自己编写了一个比较函数:
{
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;
}
ps:最上面的的遍历两个ArrayList的算法有点糙,感觉应该有更好看的方法,以后有时间优化一下。