C 中相等性判斷

2022-06-12 05:24:06 字數 1330 閱讀 9149

我們在想對乙個可列舉的物件集合進行去重操作時,一般第乙個想到的就是就是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 部分原始碼的時候拿捏不定其中乙個判斷的意思,於是趁機深入研究了一番,總算覺得比較清楚了,今天做一下筆記,以作備忘。最常見的相等性判斷 使用最頻繁,它通常用...