替代字典做快速键查找

本文关键字:查找 字典 | 更新日期: 2023-09-27 17:50:20

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

这工作得很好,但是我必须在键值对的值端插入一些东西。我只会使用List(Of T),但我想要哈希表查找的字典提供的性能。在。net中是否有更适合此目的的数据收集?

替代字典做快速键查找

我建议使用HashSet<T>。如果您只需要知道密钥已经被使用过,那么您可以直接输入密钥。

这也很简单:

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

Add就像"add if not there"。如果添加了项,则返回true。如果项目已经在集合中,则返回false

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

在。net 3.5或更高版本中,您可以为此目的使用HashSet。您需要的方法称为AddContains。这两种操作的时间复杂度都是O(log n),而List的时间复杂度为O(n)。

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

如果总是在Add方法中包含某些内容的要求很烦人,您可以创建自己的泛型键类,它可以适应更好的底层。net实现,因为它们被发现。例如,假设VB。净:

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);
        }