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的封裝,如果想要更符合你專案的封裝,還請自己多理解或...