我們?cè)谙雽?duì)一個(gè)可枚舉的對(duì)象集合進(jìn)行去重操作時(shí),一般第一個(gè)想到的就是就是Linq的Distinct方法。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),潘集企業(yè)網(wǎng)站建設(shè),潘集品牌網(wǎng)站建設(shè),網(wǎng)站定制,潘集網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,潘集網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
先定義一個(gè)類,然后使用Distinct方法去重
class Man { public int Age { get; set; } public string Name { get; set; } public string Adress { get; set; } public decimal Weight { get; set; } public decimal Height { get; set; } }
Listlist = new List () { new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170}, new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170} }; var distinct = list.Distinct();
然而去重得到的distinct集合的Count依然為二,集合里依然存在兩個(gè)Adam。
實(shí)際上,Distinct方法內(nèi)進(jìn)行比較的是聲明的引用,而不是對(duì)象屬性,就和對(duì)兩個(gè)屬性一模一樣的對(duì)象使用Equals()方法得到的是False一樣。
因此我們對(duì)對(duì)象集合使用Distinct方法時(shí)要使用重載Distinct
要使用這個(gè)方法,我們得重寫IEqualityComparer接口,再使用Distinct方法:
public class ManComparer : IEqualityComparer{ public bool Equals(Man x, Man y) { return x.Age == y.Age && x.Name == y.Name && x.Adress == y.Adress && x.Weight == y.Weight && x.Height == y.Height; } public int GetHashCode(Man obj) { return obj.GetHashCode(); } } var distinct = list.Distinct(new ManComparer());
然而,再一次,distinct集合內(nèi)依然有兩個(gè)對(duì)象。
實(shí)際上,由于直接獲取對(duì)象的HashCode,用HashCode進(jìn)行比較的速度比 Equals 方法更快,
因此IEqualityComparer內(nèi)部會(huì)在使用 Equals 前先使用 GetHashCode 方法,在兩個(gè)對(duì)象的HashCode都相同時(shí)即刻判斷對(duì)象相等。
而當(dāng)兩個(gè)對(duì)象HashCode不相同時(shí), Equals 方法就會(huì)被調(diào)用,對(duì)要比較的對(duì)象進(jìn)行判斷。
由于在上例中l(wèi)ist中的兩個(gè)引用實(shí)際上是兩個(gè)不同的對(duì)象,因此HashCode必定不相同
所以要觸發(fā)Equlas方法,我們需要改 GetHashCode ,讓它返回相同的常量
public class ManComparerNew : IEqualityComparer{ public bool Equals(Man x, Man y) { return x.Age == y.Age && x.Name == y.Name && x.Adress == y.Adress && x.Weight == y.Weight && x.Height == y.Height; } public int GetHashCode(Man obj) { return 1; } } var distinct = list.Distinct(new ManComparerNew());
現(xiàn)在distinct集合中就只有一個(gè)Man對(duì)象了,成功實(shí)現(xiàn)了去重。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。