有人知道Set
C#中是否有与Java 集合相当的东西?我知道您可以通过填充但忽略值来使用a Dictionary
或a 模仿集合HashTable
,但这不是一种非常优雅的方法。
有人知道Set
C#中是否有与Java 集合相当的东西?我知道您可以通过填充但忽略值来使用a Dictionary
或a 模仿集合HashTable
,但这不是一种非常优雅的方法。
Answers:
尝试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)集合未排序,并且不能包含重复的元素...
如果您使用的是.NET 3.5,则可以使用HashSet<T>
。确实,.NET不能像Java那样满足集合要求。
该Wintellect的PowerCollections可以帮助太大。
如果您使用的是.NET 4.0或更高版本:
如果您需要排序,请使用SortedSet<T>
。否则,请使用,HashSet<T>
因为它O(1)
用于搜索和操纵操作。虽然SortedSet<T>
是O(log n)
搜索和处理操作。
我使用Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
它在许多OSS项目中都使用过,我是在NHibernate中首次遇到的
在CodePlex上了解PowerCollections。除了Set和OrderedSet之外,它还有其他一些有用的集合类型,例如Deque,MultiDictionary,Bag,OrderedBag,OrderedDictionary和OrderedMultiDictionary。
对于更多馆藏,还有C5通用馆藏库。
我知道这是一个旧线程,但是我遇到了同样的问题,发现HashSet非常不可靠,因为给定相同的种子,GetHashCode()返回不同的代码。所以,我想,为什么不只使用List并隐藏这样的add方法
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
由于List仅使用Equals方法确定相等性,因此可以在T类型上定义Equals方法,以确保获得所需的结果。
List.Contains
很O(n)
复杂,这意味着您的Add
方法现在也变得很O(n)
复杂。假设不需要Add
为这两个内部集合调整大小,List
并且HashMap
应该很O(1)
复杂。TLDR:这可以起作用,但是它很笨拙,效率较低。