定義:什麼是HashSet?

HashSet C#HashSet數據結構是在.NET Framework 3.5中引入的。 能夠在HashSet MSDN頁面上找到已實現成員的完整列表。 html

  1. 在哪裏使用?
  2. 你爲何要用它?

#1樓

從應用程序的角度來看,若是隻須要避免重複,那麼HashSet就是您正在尋找的,由於它的查找,插入和刪除複雜性是O(1) - 常量 。 這意味着不管HashSet有多少元素都須要花費相同的時間來檢查是否存在這樣的元素,並且由於你在O(1)處插入元素也是如此,這使得它很是適合這類事情。 數組


#2樓

簡單地說,而且沒有透露廚房祕密:通常來講,集合是一個不包含重複元素的集合,其元素沒有特定的順序。 所以, HashSet<T>相似於通用List<T> ,可是以丟失順序爲代價,針對快速查找(經過哈希表,顧名思義)進行了優化。 數據結構


#3樓

    1. HashSet包含一組對象,但它容許您輕鬆快速地肯定對象是否已存在於集合中。 它經過內部管理數組並使用從對象的哈希碼計算的索引存儲對象來實現。 看看這裏 函數

    2. HashSet是一個包含惟一元素的無序集合。 它具備標準的集合操做Add,Remove,Contains,但因爲它使用基於散列的實現,所以這些操做是O(1)。 (與List相反,例如,對於Contains和Remove,它是O(n)。) HashSet還提供標準集合操做,例如並交集對稱差別看看這裏 測試

  1. 集合有不一樣的實現。 有些經過散列元素使插入和查找操做超快。 可是,這意味着添加元素的順序將丟失。 其餘實現以較慢的運行時間爲代價來保留添加的順序。 優化

C#中的HashSet類用於第一種方法,所以保留元素的順序。 它比常規List快得多。 一些基本的基準測試代表,在處理主要類型(int,double,bool等)時,HashSet的速度要快得多。 使用類對象時速度要快得多。 因此關鍵是HashSet很快。 spa

HashSet的惟一問題是索引沒法訪問。 要訪問元素,您可使用枚舉器或使用內置函數將HashSet轉換爲List並迭代它。 看看這裏 code


#4樓

HashSet具備內部結構(哈希),能夠快速搜索和識別項目。 缺點是迭代HashSet (或經過索引獲取項目)至關慢。 htm

那麼爲何有人想要知道一個條目中是否已存在一個條目? 對象

HashSet有用的一種狀況是從可能存在重複項的列表中獲取不一樣的值。 將項目添加到HashSet ,能夠快速肯定項目是否存在( Contains運算符)。

HashSet其餘優勢是Set操做: IntersectWithIsSubsetOfIsSupersetOfOverlapsSymmetricExceptWithUnionWith

若是您熟悉對象約束語言,那麼您將識別這些設置操做。 您還將看到它距離可執行UML的實現更近了一步。

相關文章
相關標籤/搜索