我們在想對乙個可列舉的物件集合進行去重操作時,一般第乙個想到的就是就是linq的distinct方法。
先定義乙個類,然後使用distinct方法去重。
class man
public string name
public string adress
public decimal weight
public decimal height
}listlist = new list()
,new man()
};var distinct = list.distinct();
然而去重得到的distinct集合的count依然為二,集合裡依然存在兩個adam。
實際上,distinct方法內進行比較的是宣告的引用,而不是物件屬性,就和對兩個屬性一模一樣的物件使用equals()方法得到的是false一樣。
因此我們對物件集合使用distinct方法時要使用過載distinct(this ienumerablesource, iequalitycomparercomparer);
要使用這個方法,我們得重寫iequalitycomparer介面,再使用distinct方法:
public class mancomparer : iequalitycomparer
public int gethashcode(man obj)
}var distinct = list.distinct(new mancomparer());
然而,再一次,distinct集合內依然有兩個物件。
實際上,由於直接獲取物件的hashcode,用hashcode進行比較的速度比 equals 方法更快,因此iequalitycomparer內部會在使用 equals 前先使用 gethashcode 方法,在兩個物件的hashcode都相同時即刻判斷物件相等。而當兩個物件hashcode不相同時, equals 方法就會被呼叫,對要比較的物件進行判斷。
由於在上例中list中的兩個引用實際上是兩個不同的物件,因此hashcode必定不相同,所以要觸發equlas方法,我們需要改 gethashcode ,讓它返回相同的常量.
public class mancomparernew : iequalitycomparer
public int gethashcode(man obj)
}var distinct = list.distinct(new mancomparernew());
現在distinct集合中就只有乙個man物件了,成功實現了去重。
最後的故事真實印記
js中相等性判斷探索
最近發現乙個比較神奇的問題如下 false true true true 一臉懵逼中。那麼,現在就來從開始探索一下這道題的原理 js比較操作 js提供了三中不同的比較操作,分別是 嚴格相等 triple equals 或 identity 使用 寬鬆相等 double equals 使用 es6新出...
初時相等性判斷
1.概述 c 中有四種方式用來進行相等性判斷,如下 object.equals object value,object value2 會呼叫第乙個引數的例項equals方法,永遠不要重寫他。object的virtualinstance equals方法 預設比較兩個物件的位址,由於這是個虛方法,所以...
Ruby中相等性判斷的4種方法
很早就知道 ruby 有 4 種相等性判斷方法,分別是 equal?和 eql?平常程式中都有使用,但是感覺對其缺乏深入理解,今天讀 rails 部分原始碼的時候拿捏不定其中乙個判斷的意思,於是趁機深入研究了一番,總算覺得比較清楚了,今天做一下筆記,以作備忘。最常見的相等性判斷 使用最頻繁,它通常用...