C#集合?

有谁知道是否有一个很好的C#中的Java Set集合? 我知道你可以通过填充但忽略这些值来使用DictionaryHashTable来模仿一个集合,但这不是一个很好的方法。

试试HashSet :

HashSet(Of T)类提供了高性能的集合操作。 一个集合是一个不包含重复元素,其元素没有特定顺序的集合…

HashSet(Of T)对象的容量是对象可以容纳的元素的数量。 随着元素添加到对象,HashSet(Of T)对象的容量会自动增加。

HashSet(Of T)类基于math集合的模型,并提供与访问Dictionary(Of TKey,TValue)或Hashtable集合的键类似的高性能集操作。 简而言之,HashSet(Of T)类可以被认为是没有值的Dictionary(Of TKey,TValue)集合。

HashSet(Of T)集合不sorting,不能包含重复的元素…

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

Wintellect PowerCollections也可以提供帮助。

HashSet<T>数据结构:

框架类库的HashSet<T>数据结构是在.NET Framework 3.5中引入的。 其成员的完整列表可以在MSDN参考页findHashSet<T>

HashSet<T>或多或less地build立在math集之后 ,这意味着:

  1. 它可能不包含重复的值。

  2. 它的要素没有特定的顺序; 因此该types不实现IList<T>接口,而是更基本的ICollection<T> 。 因此,哈希集内的元素不能通过索引被随机访问; 他们只能通过枚举器迭代。

  3. UnionIntersectionIsSubsetOfIsSupersetOf等某些设置function可用。 这些可以派上用场,处理多套。

HashSet<T>List<T>之间的另一个区别是,调用散列集的Add(item)方法会返回一个布尔值:如果添加了项目,则返回true否则返回false (因为已经在集合中find了)。

为什么不List<T>

由于HashSet<T>只是一个唯一对象的集合,因此您可能会想知道为什么它必须是一个数据结构。 正常的List<T>可以通过检查在添加之前是否在列表中find对象来具有相同的行为。

简短的答案是速度。 通过正常List<T>search得到非常缓慢,因为更多的元素被添加。 HashSet<T>需要一个能够快速search和插入速度的结构devise。

基准:

我们来比较HashSet<T>List<T>的性能速度。

每个试验包括从0到9,999到每个集合的整数。 但是,对每个整数应用mod 25。 Mod 25使得项目的最大types为25.由于添加了10,000个元素,这迫使400发生了碰撞,给数据结构一个使用他们的searchalgorithm的机会。 在10,000次试验之后测量3次并平均。

不要太在意testing的具体运行时间,因为它们依赖于我的硬件,但看看它们是如何比较的。

  Average time [ms] ---------------------------- HashSet<T> 2,290 List<T> 5,505 

现在我们来制作元素对象,而不是原始types。 我写了一个快速的Person类,有三个字段: NameLastNameID 。 由于我没有包含任何比较对象的具体方法,因此所有元素都将被添加而不会产生冲突。 这一次1000 Person对象被添加到每个集合进行一次试用。 1000次试验共计3次。

  Average time [ms] ---------------------------- HashSet<Person> 201 List<Person> 3,000 

正如你所看到的,运行时间的差异在使用对象时变得天文数字,使得HashSet<T>有利。

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

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

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

查看CodePlex上的PowerCollections 。 除了Set和OrderedSet以外,还有其他一些有用的集合types,例如Deque,MultiDictionary,Bag,OrderedBag,OrderedDictionary和OrderedMultiDictionary。

对于更多的collections,还有C5通用collections库 。

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

在需要sorting的情况下,使用SortedSet<T> 。 否则,如果你不这样做,那么使用HashSet<T>因为它是O(1)的search和操作操作。 而SortedSet<T>O(log n)用于search和操作操作。

你可以在几个小时内实现你自己可行的集合实现。 当我必须这样做时,我使用了这个(对不起,我没有代码方便): http : //java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html

我知道这是一个旧的线程,但我遇到了同样的问题,发现HashSet是非常不可靠的,因为给定相同的种子,GetHashCode()返回不同的代码。 所以,我想,为什么不只是使用一个List并隐藏像这样的add方法

 public class UniqueList<T> : List<T> { public new void Add(T obj) { if(!Contains(obj)) { base.Add(obj); } } } 

由于List仅使用Equals方法确定相等性,因此可以在Ttypes上定义Equals方法以确保获得所需的结果。