上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等?
不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲。你不妨想想,你自己开始学习编程的时候又是什么个光景?
好,于是,这位初学者朋友就做了以下尝试:
byte[] buffer1 = {0x001,0x002,0x003};byte[] buffer2 = {0x001,0x002,0x003};
Console.WriteLine(buffer1== buffer2);
想一下,这个方法行吗?结果一运行,这位朋友差点晕倒,呵呵。buffer1 == buffer2比较的是这两个byte[]实例,不会去比较里面的元素。
这位朋友吸取教训后,把代码作如下修改:
byte[] buffer1 = {0x001,0x002,0x003};byte[] buffer2 = {0x001,0x002,0x003};boolisEq =false;if(buffer1.Length !=buffer2.Length)
{
isEq=false;
}else{
isEq=true;for(inti =0; i < buffer1.Length; i++)
{if(buffer1[i] !=buffer2[i])
{
isEq=false;
break;
}
}
}
Console.WriteLine(isEq);
这一次有效果了,来,为这位朋友所取得的成就鼓掌。
到了此处,大概是可以了结了,可是这位朋友很执着,他继续问:“有没有更简单一些的方法?”
我不回答,于是,他又动起脑子,不久,又写出一段代码:
publicstaticclassByteArrayExt
{publicstaticboolIsEqual(thisbyte[] src,byte[] dis)
{boolisEq =false;if(src.Length !=dis.Length)
{
isEq=false;
}else{
isEq=true;for(inti =0; i < src.Length; i++)
{if(src[i] !=dis[i])
{
isEq=false;
break;
}
}
}returnisEq;
}
}
他把刚才的代码就写到扩展方法中,扩展对象是byte[]类型。以后只要遇到这种情况就不必每次都写那么多代码,直接调用扩展方法就可以了。
Console.WriteLine(buffer1.IsEqual(buffer2));
不错,看来这位同学悟性挺高,懂得发挥扩展方法的作用了。但是,这位兄台仍旧不满意,还不够简单。
其实,.NET类库已经有一个现成的方法了,也是扩展方法,要比较两个序列(如数组,列表等)中各个元素是否相等,只要调用该方法即可,不用自己写代码实现。什么方法呢?这个方法的芳名叫做SequenceEqual。
因此,整个程序的代码我们完全可以很简单地完成。
byte[] buffer1 = {0x001,0x002,0x003};byte[] buffer2 = {0x001,0x002,0x003};
Console.WriteLine(buffer1.SequenceEqual(buffer2));
这位仁兄如获至宝,马上兴奋起来,啊!原来还可以这样耍!就好比孙行者在龙宫发现如意棍一样的兴奋。
可能有些朋友又会问了,如果我们比较的元素是自己编写的类呢?我需要自己的比较规则。无妨,SequenceEqual方法还有一个重载,就是可以向方法的参数传一个实现了IEqualityComparer<inT>接口的对象。
由于EqualityComparer<T>类实现了该接口,在我自自定义比较器时,可以直接从该类派生。
比如我们定义了一个“帅哥”类,它包含Name和ID两个属性,对于任意两个“帅哥”对象,只要ID相等,我们就认为他们是同一位帅哥。
publicclass帅哥
{publicintID {get;set; }publicstringName {get;set; }
}
然后,我们定义一个比较器,专门用于判断两位帅哥是否为同一位帅哥。
publicclass帅哥EqualityComparer : EqualityComparer<帅哥>{publicoverrideboolEquals(帅哥 x, 帅哥 y)
{if(x.ID ==y.ID)
{returntrue;
}returnfalse;
}publicoverrideintGetHashCode(帅哥 obj)
{returnobj.ID.GetHashCode();
}
}
来,开始做测试吧。
帅哥[] sgarr1 ={new帅哥 { ID =1, Name ="小李"},new帅哥 { ID =2, Name ="小刘"},new帅哥 { ID =3, Name ="小王"}
};
帅哥[] sgarr2={new帅哥 { ID =1, Name ="小李"},new帅哥 { ID =2, Name ="小刘"},new帅哥 { ID =3, Name ="小王"}
};
帅哥[] sgarr3={new帅哥 { ID =7, Name ="小张"},new帅哥 { ID =8, Name ="小黄"},new帅哥 { ID =5, Name ="小胡"}
};//实例化比较器帅哥EqualityComparer comparer =new帅哥EqualityComparer();
Console.WriteLine(sgarr1.SequenceEqual(sgarr2, comparer));
Console.WriteLine(sgarr2.SequenceEqual(sgarr3, comparer));
至此,相信这位仁兄已经不亦乐乎了。
总结:我们平时做项目写程序都应该向这位仁兄学习,努力寻找最简单最高效的方法去处理问题。