C# Set collection?
有人知道在C语言中是否有一个相当于Java的EDCOX1 0集合的等价物?我知道你可以通过填充但忽略这些值来模仿使用
如果您使用.NET 3.5,则可以使用
Wintelect PowerCollections也可能有帮助。
在.NET Framework 3.5中引入了框架类库的
它不能包含重复的值。
它的元素没有特殊的顺序;因此类型不实现
可以使用某些设置功能,如
为什么不是
由于
简短的回答是速度。当添加更多元素时,通过普通的
Benchmarks:
让我们比较一下
每一个试验都包括将0到9999的整数添加到每个集合中。然而,mod 25应用于每个整数。mod 25使项目的最大类型为25。由于添加了10000个元素,这迫使400个冲突发生,使数据结构有机会使用它们的搜索算法。在10000次试验后测量3次并取平均值。
不要太关注测试的具体运行时间,因为它们依赖于我的硬件,但是看看它们之间的比较。
1 2 3 4 | Average time [ms] ---------------------------- HashSet<T> 2,290 List<T> 5,505 |
现在让我们把元素变成对象,而不是原始类型。我写了一个快速的
1 2 3 4 | Average time [ms] ---------------------------- HashSet<Person> 201 List<Person> 3,000 |
如您所见,在使用对象时,运行时间的差异会变成天文数字,这使得
试试HashSet:
The HashSet(Of?T) class provides high-performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order...
The capacity of a HashSet(Of?T) object is the number of elements that the object can hold. A HashSet(Of?T) object's capacity automatically increases as elements are added to the object.
The HashSet(Of?T) class is based on the model of mathematical sets and provides high-performance set operations similar to accessing the keys of the Dictionary(Of?TKey,?TValue) or Hashtable collections. In simple terms, the HashSet(Of?T) class can be thought of as a Dictionary(Of?TKey,?TValue) collection without values.
A HashSet(Of?T) collection is not sorted and cannot contain duplicate elements...
如果您使用的是.NET 4.0或更高版本:
如果需要排序,则使用
我使用iesi.collections http://www.codeproject.com/kb/recipes/sets.aspx
它在很多OSS项目中使用,我第一次在NHibernate遇到它
我在
看看codeplex上的PowerCollections。除了set和orderedset之外,它还有一些其他有用的集合类型,如deque、multictionary、bag、orderedsbag、ordereddictionary和orderedmultidictionary。
对于更多的集合,还有C5通用集合库。
您可以在几个小时内实现自己的可操作集实现。当我不得不这样做的时候我就使用了这个(对不起,我手边没有代码):http://java.sun.com/j2se/1.4.2/docs/api/java/util/set.html
我知道这是一个旧线程,但我遇到了同样的问题,发现哈希集非常不可靠,因为给定了相同的种子,getHashCode()返回了不同的代码。所以,我想,为什么不使用一个列表并隐藏这样的添加方法呢?
1 2 3 4 5 6 7 8 9 10 | public class UniqueList<T> : List<T> { public new void Add(T obj) { if(!Contains(obj)) { base.Add(obj); } } } |
因为List只使用equals方法来确定相等性,所以可以在T类型上定义equals方法以确保获得所需的结果。