C# 可替代字典进行快捷键查找?

C# 可替代字典进行快捷键查找?,c#,.net,vb.net,data-structures,C#,.net,Vb.net,Data Structures,如果我处理了一个特定的值,我会遇到需要跟踪的情况。在这些情况下,我使用字典(TKey,TValue)跟踪我处理过的值。基本上,在处理每个值时,我将处理后的值作为键插入字典。当我想查看是否已处理该值时,我使用ContainsKey方法查看该值是否存在于集合中 这很有效,但我必须在键值对的值端插入一些内容。我只想使用一个列表(T),但我想要字典提供的哈希表查找的性能。Net中是否有更适合此目的的数据收集功能?您可能会使用,但我不确定它是否像Dictionary一样有效,并且需要您将键强制转换为字符串

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

这很有效,但我必须在键值对的值端插入一些内容。我只想使用一个
列表(T)
,但我想要字典提供的哈希表查找的性能。Net中是否有更适合此目的的数据收集功能?

您可能会使用,但我不确定它是否像Dictionary一样有效,并且需要您将键强制转换为字符串

如果总是在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
        var cKeys = new KeyDictionary<int>();

        if (!(cKeys.ContainsKey(1)))
        {
            cKeys.Add(1);
        }
在C#中:

公共类键字典:字典
{
公共无效添加(T键)
{
base.Add(key,false);
}
}
要声明实例并添加值,请执行以下操作:

    Dim cKeys As New KeyDictionary(Of Integer)

    If Not cKeys.ContainsKey(1) Then
        cKeys.Add(1)
    End If
        var cKeys = new KeyDictionary<int>();

        if (!(cKeys.ContainsKey(1)))
        {
            cKeys.Add(1);
        }
var-cKeys=new-keydedictionary();
如果(!(cKeys.ContainsKey(1)))
{
添加(1);
}

在.NET 3.5或更高版本上,您可以为此使用
哈希集。您需要的方法称为
Add
Contains
。这两个操作的时间复杂度都是O(logn),而对于
列表

我建议使用。如果您只需要知道密钥已被使用,则只需输入密钥即可

这也很简单:

if (myHashSet.Add(key))
{
    // item wasn't in the hash set, so process it.
}
Add
类似于“如果不存在则添加”。如果添加了项,则返回
true
。如果项目已在集合中,则返回
false


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

是否有
TValue
可以使用的辅助键?如果没有,最好的方法是列出一个
列表,并使用谓词进行查找。@casperOne:没有,我只需要键。如果您已经在一个属性上键入了键,但没有第二个属性来区分组中的项目(您实际上是在按
分组,这里是
分组)“那就没有字典能帮你了。”卡斯佩林:恐怕我误解了你的要求。字典对我很有帮助,因为它提供了一种存储和快速检查一组唯一键的方法。不得不把一些东西放在这对情侣的价值方面,真是令人讨厌。明白了。实际上,
Add
Contains
都是O(1)。看看文档。@Jim,嗯?似乎找不到。在这里的备注:。“如果Count小于内部数组的容量,则此方法为O(1)操作。如果必须调整HashSet对象的大小,则此方法为O(n)操作,其中n为Count。”谢谢!我意识到我真的累了。现在看起来O(1)和O(n)分别是最佳情况和最坏情况下的时间复杂度,这与列表(!)的时间复杂度相同。HashSet查找的平均时间复杂度是O(logn),这比列表的平均查找时间复杂度O(n)要好。@ft1最坏的情况是O(n),是真的,但假设一个设计良好的哈希函数,摊销的平均时间复杂度是O(1)。这就是为什么我喜欢这个网站:我甚至没有意识到HashSet在这个答案之前就存在(我从1.0开始就在.Net中编程,所以有时会有新的东西从我身边溜走)。现在,我有了一个更好的方法来解决许多问题。谢谢!@competable_tech,如果你对它们进行反编译,你会看到HashSet使用了与dictionary的密钥集合相同的实现。