有沒有人知道在C#中是否有與Java的Set
集合相當的好?我知道你可以使用Dictionary
或HashTable
通過填充但忽略這些值來模仿一組數據,但這不是一個很好的方法。C#設置集合?
C#設置集合?
回答
嘗試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)已收集沒有排序,不能包含重複的元素......
不幸的是,直到最近才添加了HashSets。如果您使用的是舊版本的框架,那麼您將不得不堅持使用舊的Dictionary <>或Hashtable。 – 2008-10-08 16:36:48
如果您使用.NET 3.5,您可以使用HashSet<T>
。確實,.NET並不像Java那樣迎合集合。
Wintellect PowerCollections也可能有幫助。
有沒有人知道它爲什麼叫做HashSet而不是Set? – Wouter 2009-06-24 07:57:22
我懷疑Set是某些語言的關鍵字,這可能會導致問題。 – 2009-06-24 08:10:40
`Set`是VB中的一個關鍵字。 – 2009-11-26 01:02:07
我用Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
它在很多OSS項目的使用,我第一次碰到它的NHibernate
來看一看PowerCollections在CodePlex上時。除Set和OrderedSet外,它還有其他一些有用的集合類型,如Deque,MultiDictionary,Bag,OrderedBag,OrderedDictionary和OrderedMultiDictionary。
對於更多的收藏,也有C5 Generic Collection Library。
你可以在幾個小時內實現你自己的工作集實現。我使用這個時,我必須這樣做(對不起,我沒有代碼方便):http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html
我使用一個圍繞Dictionary<T, object>
包裝,將空值存儲在值。這給了O(1)添加,查找和刪除鍵,以及所有的意圖和目的就像一個集合。
我知道這是一箇舊的線程,但我遇到了同樣的問題,發現HashSet是非常不可靠的,因爲給定相同的種子,GetHashCode()返回不同的代碼。所以,我想,爲什麼不直接使用列表和隱藏這樣
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
add方法由於列表使用Equals方法只是確定平等,你可以在你的T型定義Equals方法,以確保您獲得理想的結果。
的HashSet<T>
數據結構:
框架類庫的HashSet<T>
數據結構在.NET Framework 3.5中引入的。其成員的完整列表可在MSDN reference page for HashSet<T>
找到。
HashSet<T>
一個mathematical set之後或多或少建模,這意味着:
它可能包含不重複的值。
其元素沒有特定的順序;因此該類型不實現
IList<T>
接口,但更基本的ICollection<T>
。因此,散列集內的元素不能通過索引隨機訪問;他們只能通過枚舉器迭代。某些設置功能,如
Union
,Intersection
,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
類與三個字段:Name
,LastName
和ID
。由於我沒有包含任何比較對象的具體方法,因此所有元素都將被添加而不會發生碰撞。這次將1000 Person
對象添加到每個集合中進行單個試用。 1000組試驗的總次數平均爲1000次。
Average time [ms]
----------------------------
HashSet<Person> 201
List<Person> 3,000
正如你可以看到,使用對象時,使得HashSet<T>
有利的運行時間的差異成爲天文數字。
如果你使用.NET 4.0或更高版本:
在你需要排序,然後使用SortedSet<T>
的情況。否則,如果你不這樣做,那麼使用HashSet<T>
,因爲它是O(1)
用於搜索和操作操作。而SortedSet<T>
是O(log n)
用於搜索和操作操作。
- 1. Objective-C設置集合的代理
- 2. 設置集合類型swift
- 3. C++壽命內置集合
- 4. IEnumerable集合的並置C#
- 5. C++集合集合
- 6. 自擦除C++設置或其他集合
- 7. C++設置交集和使用數組的聯合
- 8. 設置DataSource屬性時,不能修改項目集合。 C#
- 9. 在C++中有效設置聯合和交集
- 10. C#.net修飾器模式轉換/設置集合
- 11. 在c中設置一個實體集合爲空#
- 12. reloadData後設置集合視圖高度
- 13. 在argparse中設置互斥集合
- 14. jaxb,集合的單項設置器
- 15. Scala:設置更新集合的操作?
- 16. meteor.js - 設置控制器訪問集合
- 17. 在IValidatableObject上設置ValidationContext的Items集合?
- 18. 設置大量集合的大小
- 19. 從XAML(WPF)設置集合DependencyProperty
- 20. 在JavaScript中設置哈希集合?
- 21. Spring Data MongoDB:設置資源庫集合?
- 22. Magento:在集合上設置LIMIT
- 23. 如何設置Jekyll集合歸檔URL?
- 24. 獲取集合時未設置idAttribute
- 25. 基於集合的值設置圖標
- 26. 如何在線設置集合?
- 27. 設置全局集合的內容
- 28. AngularJs - 從集合屬性設置模型
- 29. 帶設置子集合的GWT RequestFactory
- 30. 如何設置MongoTemplate集合映射
你可以在這裏找到一些關於Hashset的基本信息。 http://dotnetk.com/c-hashset-csharp/ – 2017-10-08 11:53:50