C#集集合?


Answers:


140

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


8
不幸的是,直到最近才添加了HashSets。如果您使用的是较旧版本的框架,则必须坚持使用笨拙的Dictionary <>或Hashtable。
格雷格D

411

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

Wintellect的PowerCollections可以帮助太大。


16
我怀疑Set是某些语言的关键字,这可能会引起问题。
乔恩·斯基特

3
@Manish:不,不是。请参阅C#3规范的2.4.3节。它仅对属性具有特殊含义。
乔恩·斯基特

28
称为HashSet而不是Set的原因与Java中的相同-“ Set”描述一个接口,而“ HashSet”描述一个实现-具体来说,这是一个由Hash Map支持的Set。这样,我们知道(或应该强烈期望)插入和访问应花费O(1)访问时间,而“ LinkedListSet”将导致我们期望插入和访问花费O(n)时间。
大卫·索瑟

5
您的意思是“ .NET不能像Java那样适合集合。”?与Java相比,此Set是否某种程度上不完美?
路易斯·里斯

34
@路易斯:你在说哪一套?Java 针对各种情况有许多 Set的不同实现。.NET在.NET 3.5(HashSet)中有一个,而在.NET 4(HashSet和SortedSet)中有两个。我们不得不等到.NET 3.5才能开始的事实令人惊讶。
乔恩·斯基特

26

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

如果您需要排序,请使用SortedSet<T>。否则,请使用,HashSet<T>因为它O(1)用于搜索和操纵操作。虽然SortedSet<T>O(log n)搜索和处理操作。



13

我在周围使用包装器Dictionary<T, object>,在值中存储null。这使O(1)在键上进行添加,查找和删除,并且所有意图和目的的行为都类似于集合。


2
您必须表示它大致等同于std :: unordered_set。std :: set是有序的。例如,您可以快速找到范围的起点和终点,并从起点到终点进行迭代,以键顺序访问项目。SortedDictionary 大致相当于标准::集。
doug65536

11

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

对于更多馆藏,还有C5通用馆藏库


-5

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


13
您不想使用它的原因是因为它List.ContainsO(n)复杂,这意味着您的Add方法现在也变得很O(n)复杂。假设不需要Add为这两个内部集合调整大小,List并且HashMap应该很O(1)复杂。TLDR:这可以起作用,但是它很笨拙,效率较低。
理查·马斯克

6
当然,如果您的对象没有为GetHashCode返回适当的值,则不应将其放入基于哈希的容器中。修复GetHashCode比使用效率较低的容器要好。
bmm6o 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.