什么是stl集的C#等价物?

时间:2009-02-22 18:33:33

标签: c# data-structures

我想使用C#在平衡二进制搜索树中存储一些值。我查看了泛型命名空间中的集合,但我没有找到stl集的等价物。

我可以使用哪些通用收藏品? (我不想存储键/值对......只是值。)

5 个答案:

答案 0 :(得分:14)

您可以使用HashSet

  

HashSet<T>类提供高性能集合操作。集合是包含无重复元素的集合,其元素没有特定顺序。

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

答案 1 :(得分:7)

  1. 如果您需要排序集,请使用SortedDictionary<T,U>。这是使用二叉搜索树实现的。不可否认,每个条目将使用64位,因为您在下面存储了一个键值对。你可以像这样写一个包装器:

    class Set<T> : SortedDictionary<T, bool>
    {
        public void Add(T item)
        {
            this.Add(item, true);
        }
    }
    
  2. 如果您不需要排序集,请使用HashSet<T>

  3. 否则,请查看C5 Generic Collection Library。特别是TreeSet<T>。它是一棵红黑树,只存储值。

答案 2 :(得分:3)

试试RedBlackTree.NET。它在VB中,但我认为它可以很容易地转换为C#。

我相信一些集合类型实际上在内部使用了一个红黑树。所以你可能想要decompile the framework本身,并寻找一些线索。

我认为二进制树不能被HashSet替换。它们的性能特征大致相同:

HashSet - O(1)lookup(n)搜索
二进制搜索树 - O(log n)查找O(log n)搜索

如果要存储值并稍后执行搜索,则需要使用二叉树而不是HashSet。

答案 3 :(得分:2)

HashSet,但HashSet在框架的2.0版本中不可用。如果你需要2.0的东西,那么使用Dictionary,并指定一个虚拟类型(例如object,int或bool),为其提供一个虚拟值(例如null,0或false)作为第二个/ value参数(即使用字典作为一组键而不关心相关的值)。

答案 4 :(得分:1)

我知道这个问题很旧,但是对于.NET Framework 4.0及更高版本,请使用SortedSet<T>ImmutableSortedSet<T>