有谁知道Set
在 C# 中是否有与 Java 的集合相当的好东西?我知道您可以通过填充但忽略值来模拟使用 aDictionary
或 a的集合HashTable
,但这不是一种非常优雅的方式。
7 回答
如果您使用的是 .NET 3.5,则可以使用HashSet<T>
. 确实,.NET 并不像 Java 那样适合集合。
Wintellect PowerCollections也可能有所帮助。
尝试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
它在很多 OSS 项目中使用过,我第一次遇到它是在 NHibernate
我在 a 周围使用了一个包装器Dictionary<T, object>
,将空值存储在值中。这给了 O(1) 对键的添加、查找和删除,并且所有意图和目的都像一个集合一样。
在 CodePlex 上查看PowerCollections 。除了 Set 和 OrderedSet,它还有一些其他有用的集合类型,例如 Deque、MultiDictionary、Bag、OrderedBag、OrderedDictionary 和 OrderedMultiDictionary。
如需更多收藏,还有C5 Generic Collection Library。
我知道这是一个旧线程,但我遇到了同样的问题,发现 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 方法以确保获得所需的结果。