HashSet C#HashSet數據結構是在.NET Framework 3.5中引入的。 能夠在HashSet MSDN頁面上找到已實現成員的完整列表。 html
從應用程序的角度來看,若是隻須要避免重複,那麼HashSet
就是您正在尋找的,由於它的查找,插入和刪除複雜性是O(1) - 常量 。 這意味着不管HashSet
有多少元素都須要花費相同的時間來檢查是否存在這樣的元素,並且由於你在O(1)處插入元素也是如此,這使得它很是適合這類事情。 數組
簡單地說,而且沒有透露廚房祕密:通常來講,集合是一個不包含重複元素的集合,其元素沒有特定的順序。 所以, HashSet<T>
相似於通用List<T>
,可是以丟失順序爲代價,針對快速查找(經過哈希表,顧名思義)進行了優化。 數據結構
集合有不一樣的實現。 有些經過散列元素使插入和查找操做超快。 可是,這意味着添加元素的順序將丟失。 其餘實現以較慢的運行時間爲代價來保留添加的順序。 優化
C#中的HashSet
類用於第一種方法,所以不保留元素的順序。 它比常規List
快得多。 一些基本的基準測試代表,在處理主要類型(int,double,bool等)時,HashSet的速度要快得多。 使用類對象時速度要快得多。 因此關鍵是HashSet很快。 spa
HashSet
的惟一問題是索引沒法訪問。 要訪問元素,您可使用枚舉器或使用內置函數將HashSet
轉換爲List
並迭代它。 看看這裏 code
HashSet
具備內部結構(哈希),能夠快速搜索和識別項目。 缺點是迭代HashSet
(或經過索引獲取項目)至關慢。 htm
那麼爲何有人想要知道一個條目中是否已存在一個條目? 對象
HashSet
有用的一種狀況是從可能存在重複項的列表中獲取不一樣的值。 將項目添加到HashSet
,能夠快速肯定項目是否存在( Contains
運算符)。
HashSet
其餘優勢是Set操做: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
。
若是您熟悉對象約束語言,那麼您將識別這些設置操做。 您還將看到它距離可執行UML的實現更近了一步。