有没有人知道C#中与Java的Set
集合相当好的等价物?我知道你可以使用Dictionary
或HashTable
来模拟一组,方法是填充但忽略值,但这不是非常优雅的方式。
有没有人知道C#中与Java的Set
集合相当好的等价物?我知道你可以使用Dictionary
或HashTable
来模拟一组,方法是填充但忽略值,但这不是非常优雅的方式。
尝试使用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 4.0或更高版本:
如果您需要进行排序,请使用SortedSet<T>
。否则,如果不需要排序,则使用HashSet<T>
,因为它对于搜索和操作是O(1)
的。而SortedSet<T>
对于搜索和操作是O(log n)
的。
我使用的是Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
它在许多开源项目中被使用,我最初是在 NHibernate 中接触到它。
Dictionary<T, object>
的包装器,将 null 存储在值中。这样可以在键上实现 O(1) 的添加、查找和删除操作,并且在所有情况下都像一个集合一样运作。Set
和OrderedSet
之外,它还有一些其他有用的集合类型,如Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary
和OrderedMultiDictionary
。我知道这是一个旧的线程,但我遇到了同样的问题,并发现HashSet非常不可靠,因为在给定相同的种子时,GetHashCode()返回不同的代码。所以,我想,为什么不只是使用List并隐藏添加方法,像这样
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
List.Contains
的时间复杂度为O(n)
,这意味着你的Add
方法现在也变成了O(n)
的复杂度。假设内部集合不需要重新调整大小,对于List
和HashMap
,Add
应该都是O(1)
的复杂度。简而言之,这种方法虽然可行,但效率较低且有些巧妙。 - Richard Marskell - Drackir