推荐用于唯一整数集合的.NET类是什么?

9

您需要为需要保留唯一整数列表的类提供什么建议?

我需要将整数添加到集合中,并检查是否存在,例如Contains()。

还可以将它们作为字符串以列表形式显示,例如“1, 5, 10, 21”。


1
抱歉我没有具体说明。我可以使用最新的框架3.5,但是你的答案可能会帮助那些无法使用最新版本的人。 - Rick Glos
4个回答

24

HashSet

HashSet<T>类提供高性能的集合操作。一个集合是不包含重复元素并且其元素没有特定顺序的集合...

HashSet<T>对象的容量是对象可以容纳的元素数量。当向该对象添加元素时,HashSet<T>对象的容量会自动增加。

HashSet<T>类基于数学集合模型,并提供类似于访问Dictionary<TKey, TValue>Hashtable集合中的键的高性能集合操作。简单来说,HashSet<T>类可以被视为一个没有值的Dictionary<TKey, TValue>集合。

HashSet<T>集合未排序,并且不能包含重复元素...


我查看了ArrayList,它确实比数组更好,因此我删除了我的先前答案。 - EBGreen
1
HashSet 将会 ToString 类型... 而不是列表。而且他正在显示的列表是有序的,而 HashSet 不支持。 - MagicKat
正确。要获取字符串列表,您可以使用以下代码: int[] a = h.ToArray<int>(); Array.Sort<int>(a); string.Join(', ', a); 这不是高性能的,但我认为它不是常见操作,更多用于调试/查看而非计算。 - Tom Ritter
更新为 Linq:String.Join(", ", a.OrderBy(_ => _)) - user7116
@EBGreen 对于绝大多数用例来说,每种其他集合类型都比ArrayList更好。 - Richard Szalay

3
在我的测试中,我发现在处理大量数据时(例如100,000个以上),带有虚拟值的字典比哈希集合更快。我猜测这是因为字典允许你设置初始容量,但我并不确定。在您所描述的情况下,如果您期望有一个非常大的数字集,则应该使用字典,然后(或者在添加到字典中时,具体取决于意图)使用字符串构建器迭代它,以创建输出字符串。

2

如果您无法使用.NET 3.5,则无法使用HashSet。 如果是这种情况,可以基于Dictionary结构轻松自行创建。

public class Set<T> {
    private class Unit { ... no behavior }
    private Dictionary<T, Unit> d;

....
}

Unit是一种只有一个值的类型。您可以将元素映射到任何内容,只需使用键即可知道集合中包含什么。您在问题中所要求的操作很容易实现。


1
为什么要创建“Unit”类?该值可以为“null”。 - Joel B Fant
类型会是什么?“object”吗? - EfForEffort

1

你可以从KeyedCollection类继承一个类。这样,你的键可以是值本身,你可以重写ToString方法以获得所需的输出。这可能会给你想要/需要的行为。

请注意,此答案适用于Q的2.0框架部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接