如果我处理了特定值,我会遇到需要跟踪的情况。在这些情况下,我使用Dictionary(Of TKey, TValue)
来跟踪我已处理的值。基本上,在处理每个值时,我将处理后的值作为键插入到字典中。当我想查看是否已处理该值时,我使用该ContainsKey
方法查看该值是否存在于集合中。
这很好用,但我必须在键值对的值侧插入一些东西。我只会使用 aList(Of T)
但我想要 Dictionary 提供的哈希表查找的性能。.Net 中是否有更适合此目的的数据收集?
如果我处理了特定值,我会遇到需要跟踪的情况。在这些情况下,我使用Dictionary(Of TKey, TValue)
来跟踪我已处理的值。基本上,在处理每个值时,我将处理后的值作为键插入到字典中。当我想查看是否已处理该值时,我使用该ContainsKey
方法查看该值是否存在于集合中。
这很好用,但我必须在键值对的值侧插入一些东西。我只会使用 aList(Of T)
但我想要 Dictionary 提供的哈希表查找的性能。.Net 中是否有更适合此目的的数据收集?
我建议一个HashSet<T>
. 如果您只需要知道该密钥已被使用,您可以只输入密钥。
这也很简单:
if (myHashSet.Add(key))
{
// item wasn't in the hash set, so process it.
}
Add
就像“如果不存在就添加”。true
如果添加了项目,则返回。false
如果该项目已经在集合中,则返回。
或者,您可以使用Contains
来测试,然后Add
添加。
在 .NET 3.5 或更高版本上,您可以将 aHashSet
用于该目的。您需要的方法称为Add
和Contains
。这两个操作的时间复杂度为 O(log n ),而 a 的时间复杂度为 O( n ) List
。
您可能会使用System.Collections.Specialized.StringCollection,但我不确定它是否与 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
而且,在 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);
}