2008-10-08 53 views
397

有沒有人知道在C#中是否有與Java的Set集合相當的好?我知道你可以使用DictionaryHashTable通過填充但忽略這些值來模仿一組數據,但這不是一個很好的方法。C#設置集合?

+0

你可以在這裏找到一些關於Hashset的基本信息。 http://dotnetk.com/c-hashset-csharp/ – 2017-10-08 11:53:50

回答

55

嘗試HashSet

的HashSet的(Of T)類提供高性能的一組操作。一個集合是一個不包含重複元素的集合,其元素沒有特定順序...

HashSet(Of T)對象的容量是對象可容納的元素的數量。隨着元素添加到對象,HashSet(Of T)對象的容量會自動增加。

HashSet(Of T)類基於數學集模型,並提供與訪問Dictionary(Of TKey, TValue)Hashtable集合的鍵類似的高性能集合操作。簡單來說,HashSet(Of T)類可以被認爲是沒有值的Dictionary(Of TKey, TValue)集合。

一個HashSet(Of T)已收集沒有排序,不能包含重複的元素......

+5

不幸的是,直到最近才添加了HashSets。如果您使用的是舊版本的框架,那麼您將不得不堅持使用舊的Dictionary <>或Hashtable。 – 2008-10-08 16:36:48

388

如果您使用.NET 3.5,您可以使用HashSet<T>。確實,.NET並不像Java那樣迎合集合。

Wintellect PowerCollections也可能有幫助。

+2

有沒有人知道它爲什麼叫做HashSet而不是Set? – Wouter 2009-06-24 07:57:22

+16

我懷疑Set是某些語言的關鍵字,這可能會導致問題。 – 2009-06-24 08:10:40

+5

`Set`是VB中的一個關鍵字。 – 2009-11-26 01:02:07

11

來看一看PowerCollections在CodePlex上時。除Set和OrderedSet外,它還有其他一些有用的集合類型,如Deque,MultiDictionary,Bag,OrderedBag,OrderedDictionary和OrderedMultiDictionary。

對於更多的收藏,也有C5 Generic Collection Library

12

我使用一個圍繞Dictionary<T, object>包裝,將空值存儲在值。這給了O(1)添加,查找和刪除鍵,以及所有的意圖和目的就像一個集合。

-4

我知道這是一箇舊的線程,但我遇到了同樣的問題,發現HashSet是非常不可靠的,因爲給定相同的種子,GetHashCode()返回不同的代碼。所以,我想,爲什麼不直接使用列表和隱藏這樣

public class UniqueList<T> : List<T> 
{ 
    public new void Add(T obj) 
    { 
     if(!Contains(obj)) 
     { 
      base.Add(obj); 
     } 
    } 
} 

add方法由於列表使用Equals方法只是確定平等,你可以在你的T型定義Equals方法,以確保您獲得理想的結果。

97

HashSet<T>數據結構:

框架類庫的HashSet<T>數據結構在.NET Framework 3.5中引入的。其成員的完整列表可在MSDN reference page for HashSet<T>找到。

HashSet<T>一個mathematical set之後或多或少建模,這意味着:

  1. 它可能包含不重複的值。

  2. 其元素沒有特定的順序;因此該類型不實現IList<T>接口,但更基本的ICollection<T>。因此,散列集內的元素不能通過索引隨機訪問;他們只能通過枚舉器迭代。

  3. 某些設置功能,如UnionIntersection,IsSubsetOf,IsSupersetOf可用。這些可以在使用多套工具時派上用場。

HashSet<T>List<T>之間的另一個區別是調用哈希集合的Add(item)方法返回一個布爾值:如果true加入該項目,false否則(因爲它是在一組已找到)。

爲什麼不是List<T>

由於HashSet<T>只是一組獨特的對象,您可能會想知道爲什麼它必須是數據結構。一個正常的List<T>可以通過檢查在添加它之前是否在列表中找到對象來具有相同的行爲。

簡短的答案是速度。隨着更多元素的添加,通過正常搜索List<T>的速度非常快。 A HashSet<T>需要結構設計,以允許快速搜索和插入速度。

基準:

讓我們來比較一HashSet<T>的性能速度與一個List<T>

每個試驗包括從0到9,999到每個集合的整數。然而,mod 25應用於每個整數。 Mod 25使得項目的最大類型爲25個。由於添加了10,000個元素,這迫使400個碰撞發生,給數據結構一個使用他們的搜索算法的機會。在10,000次試驗之後測量3次並平均。

不要太在意測試的具體運行時間,因爲它們依賴於我的硬件,但看看它們是如何相互比較的。

  Average time [ms] 
---------------------------- 
HashSet<T>    2,290 
List<T>    5,505 

現在我們來製作元素對象而不是原始類型。我寫了一個快速Person類與三個字段:NameLastNameID。由於我沒有包含任何比較對象的具體方法,因此所有元素都將被添加而不會發生碰撞。這次將1000 Person對象添加到每個集合中進行單個試用。 1000組試驗的總次數平均爲1000次。

  Average time [ms] 
---------------------------- 
HashSet<Person>   201 
List<Person>   3,000 

正如你可以看到,使用對象時,使得HashSet<T>有利的運行時間的差異成爲天文數字。

11

如果你使用.NET 4.0或更高版本:

在你需要排序,然後使用SortedSet<T>的情況。否則,如果你不這樣做,那麼使用HashSet<T>,因爲它是O(1)用於搜索和操作操作。而SortedSet<T>O(log n)用於搜索和操作操作。