国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

【.net】從比較兩個字節(jié)數(shù)組談起

2019-11-14 16:48:09
字體:
來源:轉載
供稿:網友

上午,有位初學者朋友問:如何比較兩個字節(jié)數(shù)組中各字節(jié)是否相等?

不許笑,我一向反對嘲笑初學者,初學者不認真學習時你可以批評,但不能譏嘲。你不妨想想,你自己開始學習編程的時候又是什么個光景?

好,于是,這位初學者朋友就做了以下嘗試:

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

這一次有效果了,來,為這位朋友所取得的成就鼓掌。

到了此處,大概是可以了結了,可是這位朋友很執(zhí)著,他繼續(xù)問:“有沒有更簡單一些的方法?”

我不回答,于是,他又動起腦子,不久,又寫出一段代碼:

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

不錯,看來這位同學悟性挺高,懂得發(fā)揮擴展方法的作用了。但是,這位兄臺仍舊不滿意,還不夠簡單。

其實,.NET類庫已經有一個現(xiàn)成的方法了,也是擴展方法,要比較兩個序列(如數(shù)組,列表等)中各個元素是否相等,只要調用該方法即可,不用自己寫代碼實現(xiàn)。什么方法呢?這個方法的芳名叫做SequenceEqual。

因此,整個程序的代碼我們完全可以很簡單地完成。

            byte[] buffer1 = { 0x001, 0x002, 0x003 };            byte[] buffer2 = { 0x001, 0x002, 0x003 };            Console.WriteLine(buffer1.SequenceEqual(buffer2));

這位仁兄如獲至寶,馬上興奮起來,啊!原來還可以這樣耍!就好比孫行者在龍宮發(fā)現(xiàn)如意棍一樣的興奮。

可能有些朋友又會問了,如果我們比較的元素是自己編寫的類呢?我需要自己的比較規(guī)則。無妨,SequenceEqual方法還有一個重載,就是可以向方法的參數(shù)傳一個實現(xiàn)了IEqualityComparer<in T>接口的對象。

由于EqualityComparer<T>類實現(xiàn)了該接口,在我自自定義比較器時,可以直接從該類派生。

比如我們定義了一個“帥哥”類,它包含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));

至此,相信這位仁兄已經不亦樂乎了。

總結:我們平時做項目寫程序都應該向這位仁兄學習,努力尋找最簡單最高效的方法去處理問題。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 云霄县| 昌邑市| 沙田区| 峨眉山市| 定结县| 宁国市| 台湾省| 大余县| 留坝县| 平罗县| 鄯善县| 山西省| 海原县| 迭部县| 八宿县| 桑植县| 乐清市| 鹤岗市| 和平区| 师宗县| 永城市| 互助| 朝阳县| 贵南县| 获嘉县| 海原县| 丰台区| 寿宁县| 清镇市| 古蔺县| 永昌县| 五指山市| 平利县| 长沙市| 徐汇区| 壶关县| 永顺县| 大关县| 长宁县| 富源县| 长沙县|