在Dictionary中使用列舉

2021-09-05 05:47:28 字數 2035 閱讀 5991

自從.net framework 2.0引入泛型之後,對集合的使用就開創了新的局面。首先我們不用考慮型別是否安全,利用泛型以及對泛型引數的約束完全可以保障這一點;其次,集合元素不會因為頻繁的boxing和unboxing而影響集合遍歷與操作的效能。泛型帶來的這兩點好處毋庸置疑。在dictionary中,除了字串,我們普遍會使用值型別作為它的key,例如int型別。而列舉型別作為一種值型別,在某些時候特別是需要位操作的時候,也會經常用作key。問題就出現在這裡。

我們知道,dictionary的key必須是唯一的標識,因此dictionary需要對key進行判等的操作,如果key的型別沒有實現 iequatable介面,則預設根據system.object.equals()和gethashcode()方法判斷值是否相等。我們可以看看常用作key的幾種型別在.net framework中的定義:

public

sealed

class

string : icomparable, icloneable, iconvertible,  

icomparable<

string>, ienumerable<

string>, ienumerable,  

iequatable<

string>

public

struct

int32 : icomparable, iformattable,  

iconvertible, icomparable<

int>, iequatable<

int>

public

abstract

class

enum : valuetype,  

icomparable, iformattable, iconvertible

注意enum型別的定義與前兩種型別的不同,它並沒有實現iequatable介面。因此,當我們使用enum型別作為key值時,dictionary的內部操作就需要將enum型別轉換為system.object,這就導致了boxing的產生。沒錯,我們很難發現這個陷阱,它是導致enum作為 key值的效能瓶頸。

我們該如何解決這一問題?最簡單的方法是將enum的值先轉換為int,然後將其作為key傳入dictionary中。還有一種作法是定義乙個實現了iequalitycomparer介面的類。因為dictionary建構函式的其中乙個過載版本,可以接收 iequalitycomparer型別,通過它完成對key的判斷。iequalitycomparer介面的定義如下所示:

public

inte***ce iequalitycomparer

遺憾的是我們卻不能直接提供針對enum的實現,例如:

class

enumcomparer

: iequalitycomparer

public

int gethashcode(tenum obj)

} 因為我們不能直接對泛型型別進行==操作,以及將泛型物件強制轉換為int型別。在code project

上,有一篇名為accelerating enum-based dictionaries with generic enumcomparer

public

class

enumcomparer

: iequalitycomparerwhere t :

struct

).

compile().invoke(first, second);

}public

int gethashcode(t instance)

).compile().invoke(instance);

}} 此時,我們就可以如此使用dictionary物件:

public

enum dayofweek

var dictionary =

new dictionaryint>(

new enumcomparer());

採取這樣的做法比直接用enum型別作為dictionary的key差不多要快8倍。這難道不讓人為之驚詫嗎?

在Dictionary中使用列舉

自從.net framework 2.0引入泛型之後,對集合的使用就開創了新的局面。首先我們不用考慮型別是否安全,利用泛型以及對泛型引數的約束完全可以保障這一點 其次,集合元素不會因為頻繁的boxing和unboxing而影響集合遍歷與操作的效能。泛型帶來的這兩點好處毋庸置疑。在dictionary...

在Dictionary中使用列舉

自從.net framework 2.0引入泛型之後,對集合的使用就開創了新的局面。首先我們不用考慮型別是否安全,利用泛型以及對泛型引數的約束完全可以保障這一點 其次,集合元素不 會因為頻繁的boxing和unboxing而影響集合遍歷與操作的效能。泛型帶來的這兩點好處毋庸置疑。在dictionar...

在QTP中使用Dictionary物件

vbscript的dictionary 物件與perl的關聯陣列 associative array 類似,其中儲存的內容可以是任何資料,每乙個儲存的資料都與乙個唯一的鍵 key 關聯,鍵用於獲取每一項資料,鍵通常是整型或字串型別。在qtp中,可以把dictionary 當成陣列來用,而且可以隨時新...