535

有谁知道Set在 C# 中是否有与 Java 的集合相当的好东西?我知道您可以通过填充但忽略值来模拟使用 aDictionary或 a的集合HashTable,但这不是一种非常优雅的方式。

4

7 回答 7

426

如果您使用的是 .NET 3.5,则可以使用HashSet<T>. 确实,.NET 并不像 Java 那样适合集合。

Wintellect PowerCollections也可能有所帮助。

于 2008-10-08T16:36:17.033 回答
174

尝试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) 集合未排序且不能包含重复元素...

于 2008-10-08T16:35:05.400 回答
30

如果您使用的是 .NET 4.0 或更高版本:

如果您需要排序,请使用SortedSet<T>. 否则,如果您不这样做,则使用它,HashSet<T>因为它O(1)用于搜索和操作操作。而SortedSet<T>用于O(log n)搜索和操作操作。

于 2013-08-31T18:01:54.140 回答
15

我使用 Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx

它在很多 OSS 项目中使用过,我第一次遇到它是在 NHibernate

于 2008-10-08T16:36:34.897 回答
13

我在 a 周围使用了一个包装器Dictionary<T, object>,将空值存储在值中。这给了 O(1) 对键的添加、查找和删除,并且所有意图和目的都像一个集合一样。

于 2009-11-26T01:08:28.093 回答
12

在 CodePlex 上查看PowerCollections 。除了 Set 和 OrderedSet,它还有一些其他有用的集合类型,例如 Deque、MultiDictionary、Bag、OrderedBag、OrderedDictionary 和 OrderedMultiDictionary。

如需更多收藏,还有C5 Generic Collection Library

于 2008-10-08T16:38:54.220 回答
-6

我知道这是一个旧线程,但我遇到了同样的问题,发现 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 方法以确保获得所需的结果。

于 2012-02-04T22:50:55.647 回答