用于快速键查找的Dictionary的替代方案?

时间:2012-12-30 02:13:54

标签: c# .net vb.net data-structures

如果我处理了特定值,我会遇到需要跟踪的情况。在这些情况下,我使用Dictionary(Of TKey, TValue)来跟踪我处理的值。基本上,当处理每个值时,我将处理后的值作为键插入到字典中。当我想查看我是否已处理该值时,我使用ContainsKey方法查看该值是否存在于该集合中。

这很好用,但我必须在键值对的值侧插入一些东西。我只想使用List(Of T),但我希望得到Dictionary提供的哈希表查找的性能。 .Net中是否有更适合此目的的数据收集?

3 个答案:

答案 0 :(得分:16)

我建议HashSet<T>。如果您需要知道密钥已被使用,您可以输入密钥。

这也很简单:

if (myHashSet.Add(key))
{
    // item wasn't in the hash set, so process it.
}

Add就像“添加,如果不存在”。如果添加了项目,则返回true。如果项目已在集合中,则返回false

或者,您可以使用Contains进行测试,然后使用Add进行测试。

答案 1 :(得分:3)

在.NET 3.5或更高版本中,您可以使用HashSet来实现此目的。您需要的方法称为AddContains。两个操作都具有时间复杂度O(log n ),而不是List的O( n )。

答案 2 :(得分:0)

您可能会使用System.Collections.Specialized.StringCollection,但我不确定它是否与字典一样高,并且要求您将键转换为字符串。

如果总是在Add方法中包含某些内容的要求很烦人,那么您可以创建自己的通用密钥类,它可以适应更好的底层.Net实现。例如,假设VB.Net:

Public Class KeyDictionary(Of T)
    Inherits Dictionary(Of T, Boolean)

    Public Overloads Sub Add(key As T)
        MyBase.Add(key, False)
    End Sub
End Class

然后声明一个实例并添加一个值:

    Dim cKeys As New KeyDictionary(Of Integer)

    If Not cKeys.ContainsKey(1) Then
        cKeys.Add(1)
    End If

而且,在C#中:

public class KeyDictionary<T> : Dictionary<T, bool>
{
    public void Add(T key)
    {
        base.Add(key, false);
    }
}

声明一个实例并添加一个值:

        var cKeys = new KeyDictionary<int>();

        if (!(cKeys.ContainsKey(1)))
        {
            cKeys.Add(1);
        }