C 實現乙個基於值相等性比較的字典

2021-10-19 02:46:26 字數 4575 閱讀 7194

strin**aluedictioanry#

實現了乙個基於值進行比較的字典,實現**如下,實現的比較簡單,涉及到一些簡單的知識點,平時不怎麼用已經忘了怎麼寫了,通過寫下面的**又學習了一下

先來看測試**吧,測試**如下:

[

fact

]public

void

equalstest()

;var dic1 = strin**aluedictionary.

fromobject

(abc)

;var dic2 = strin**aluedictionary.

fromobject

(new

dictionary

<

string

,object

>()

,,})

; assert.

true

(dic1 == dic2)

; assert.

equal

(dic1, dic2);}

[fact

]public

void

distincttest()

;var dic1 = strin**aluedictionary.

fromobject

(abc)

;var dic2 = strin**aluedictionary.

fromobject

(new

dictionary

<

string

,object

>()

,,})

;var

set=

newhashset

<

strin**aluedictionary

>()

;set

.add

(dic1)

;set

.add

(dic2)

; assert.

single

(set);

}[fact

]public

void

clonetest()

,});

var dic2 = dic1.

clone()

; assert.

false

(referenceequals

(dic1, dic2));

assert.

true

(dic1 == dic2);}

[fact

]public

void

implicitconverttest()

;var strin**aluedictionary = strin**aluedictionary.

fromobject

(abc)

; dictionary<

string

,string

> dictionary = strin**aluedictionary;

assert.

equal

(strin**aluedictionary.count, dictionary.count)

;var dic2 = strin**aluedictionary.

fromobject

(dictionary)

; assert.

equal

(dic2, strin**aluedictionary)

; assert.

true

(dic2 == strin**aluedictionary)

;}

從上面的**可能大概能看出一些實現,重寫了預設的 equals 和 gethashcode,並過載了「==」 運算子,並且實現了乙個從 strin**aluedictionary 到 dictionary 的隱式轉換,來看下面的實現**:

public

sealed

class

strin**aluedictionary

:iequatable

}private

strin**aluedictionary

(strin**aluedictionary dictionary)

}public

static

strin**aluedictionary

fromobject

(object obj)

if(obj is idictionary<

string

,object

?> dictionary2)

if(obj is

strin**aluedictionary dictionary3)

return

newstrin**aluedictionary

(obj.

gettype()

.getproperties()

.todictionary

(p =

> p.name, p =

> p.

getvalue

(obj)?.

tostring()

));}

public

static

strin**aluedictionary

fromjson

(string json)

public

strin**aluedictionary

clone()

=>

new(

this);

public

int count =

> _dictionary.count;

public

bool

containskey

(string key)

=> _dictionary.

containskey

(key)

? _dictionary.

containskey

(key)

:throw

newargumentoutofrangeexception

(nameof

(key));

public

string

?this

[string key]

=> _dictionary[key]

;public dictionary<

string

,string

>

.keycollection keys =

> _dictionary.keys!

;public

bool

equals

(strin**aluedictionary? other)

if(_dictionary[key]

!= other[key])}

return

true;}

public

override

bool

equals

(object obj)

public

override

intgethashcode()

=_");}

return stringbuilder.

tostring()

.gethashcode()

;}public

static

bool

operator

==(strin**aluedictionary? current, strin**aluedictionary? other)

public

static

bool

operator

!=(strin**aluedictionary? current, strin**aluedictionary? other)

public

static

implicit

operator

dictionary

<

string

,string?>

(strin**aluedictionary dictionary)

}more#

上述**實現的有點粗糙,可能會有一些問題,僅供參考

以上**基本實現了基於想要的值的相等性比較以及 clone(複製、轉殖)的目標

實現相等性比較的時候,equals 和 gethashcode 方法也要重寫,如果沒有重寫 gethashcode,編譯器也會給出警告,如果沒有重寫 gethashcode 在實際在 hashset 或者 dictionary 裡可能會出現重複 key

過載運算子的時候需要乙個靜態方法,"==" 和 「!=」 是一對操作運算子,如果要實現兩個都要實現,不能只實現其中乙個

implicit 也算是乙個特殊的運算子,巧妙的使用隱式轉換可以大大簡化**的寫法,stackexchange.redis 中就使用了 implicit 來實現 redisvalue 和 string 等其他常用型別的隱式轉換

出處:

C 比較兩個物件的屬性值是否相等

比較 兩個型別一樣的實體類物件的值 private bool comparetype t onet,t twot propertyinfo pisone typeone.getproperties 獲取所有公共屬性 public propertyinfo pistwo typetwo.getprop...

C 為型別 類或者結構 自定義值相等性的比較

類的預設相等性比較object.equals object obj 是基於引用相等性的比較。對於結構,object.equals object 的預設實現通過使用反射來比較型別中每個欄位的值,從而執行值相等性檢查。在定義類或者結構時可以為類或者機構建立自定義的值相等比較。建立自定義比較的應用場景通常...

乙個比較全面的基於axios的封裝

在幾個公司工作過,我發現我很少看到考慮的比較全面的ajax封裝。可能是因為我待過的公司不夠優秀吧,也可能是因為我所在的團隊不夠優秀吧。基於這樣的乙個情況,我覺得我可以寫乙個比較全面的基於axios的封裝。這裡我只分享乙個相對比較全面的基於axios的封裝,如果想要更符合你專案的封裝,還請自己多理解或...