当前位置: 移动技术网 > IT编程>开发语言>.net > [.net]从比较两个字节数组谈起

[.net]从比较两个字节数组谈起

2018年04月21日  | 移动技术网IT编程  | 我要评论

时时彩计划找q:5877578,奥巴毛,沈阳华臣影城

上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等?

 

不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲。你不妨想想,你自己开始学习编程的时候又是什么个光景?

 

好,于是,这位初学者朋友就做了以下尝试:

 

            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 };

            bool isEq = false;

            if (buffer1.Length != buffer2.Length)

            {

                isEq = false;

            }

            else

            {

                isEq = true;

                for (int i = 0; i < buffer1.Length; i++)

                {

                    if (buffer1[i] != buffer2[i])

                    {

                        isEq = false;

                        break;

                    }

                }

            }

            Console.WriteLine(isEq);

 

这一次有效果了,来,为这位朋友所取得的成就鼓掌。

 

到了此处,大概是可以了结了,可是这位朋友很执着,他继续问:“有没有更简单一些的方法?”

 

我不回答,于是,他又动起脑子,不久,又写出一段代码:

 

 

    public static class ByteArrayExt

    {

        public static bool IsEqual(this byte[] src, byte[] dis)

        {

            bool isEq = false;

            if (src.Length != dis.Length)

            {

                isEq = false;

            }

            else

            {

                isEq = true;

                for (int i = 0; i < src.Length; i++)

                {

                    if (src[i] != dis[i])

                    {

                        isEq = false;

                        break;

                    }

                }

            }

            return isEq;

        }

    }

 

他把刚才的代码就写到扩展方法中,扩展对象是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<in T>接口的对象。

 

由于EqualityComparer<T>类实现了该接口,在我自自定义比较器时,可以直接从该类派生。

 

比如我们定义了一个“帅哥”类,它包含Name和ID两个属性,对于任意两个“帅哥”对象,只要ID相等,我们就认为他们是同一位帅哥。

 

    public class 帅哥

    {

        public int ID { get; set; }

        public string Name { get; set; }

    }

然后,我们定义一个比较器,专门用于判断两位帅哥是否为同一位帅哥。

 

 

    public class 帅哥EqualityComparer : EqualityComparer<帅哥>

    {

        public override bool Equals(帅哥 x, 帅哥 y)

        {

            if (x.ID == y.ID)

            {

                return true;

            }

            return false;

        }

 

        public override int GetHashCode(帅哥 obj)

        {

            return obj.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));

 

至此,相信这位仁兄已经不亦乐乎了。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网