.net专家推荐什么? 我有一个数据需要使用两个不同的密钥访问。假设数据看起来像这样:
key1
key2
data
我需要添加,通过任一键查找数据,并使用任意键删除数据数千次,并希望快速完成。
我真的很喜欢LINQ添加到代码中的清晰度但是...我已经在循环检索情况下将LINQ与字典进行了比较。我不喜欢LINQ,因为它看起来需要花费更多的时间来获取任何单个数据。我喜欢词典,因为它们的检索速度非常快。
我在考虑编写一个使用两个词典的自定义类:
key1
data
和
key2
data
每当我将数据项添加到类的实例时,类就需要将数据添加到两个不同的后备词典中。每次删除数据项时,我都需要从后备词典中删除它们。
这是处理这个问题的最佳方法吗?或者.net中有一些快速的“字典式”数据结构,它允许我有两个密钥用于相同的数据吗?
答案 0 :(得分:1)
这是处理这个问题的最佳方法吗?或者.net中有一些快速的“字典式”数据结构,它允许我有两个密钥用于相同的数据吗?
没有内置数据结构提供两个密钥,其中任何一个密钥都可以使用。
鉴于您希望通过 键进行查找(而不是同时使用两者),使用封装两个Dictionary(Of TKey, Of TValue)
的自定义类是有意义的,前提是存储两个字典的开销并不反感。
答案 1 :(得分:0)
您可以定义复合键,例如
Structure CKey
Public Key1 As String
Public Key2 As String
End Structure
使用该键的词典
Dim myDict As New Dictionary(Of CKey, String)
myDict.Add(New CKey() With {.Key1 = "key01", .Key2 = "key02"}, "Data0102")
myDict.Add(New CKey() With {.Key1 = "key11", .Key2 = "key12"}, "Data0103")
myDict.Add(New CKey() With {.Key1 = "key01", .Key2 = "key22"}, "Data0104")
myDict.Add(New CKey() With {.Key1 = "key11", .Key2 = "key22"}, "Data0105")
然后您可以运行简单的LINQ查询,如:
Dim result = From el In myDict Where el.Key.Key1 = "key01" Select el
如果您不喜欢LINQ,您仍然可以通过自己的方法循环字典,自己检查密钥。
答案 2 :(得分:0)
我真的很惊讶我在这里得到了一个解决方案(因为我是这种编程的菜鸟)。
因此,需要考虑两件事:您需要知道您正在使用哪个密钥进行搜索,以及添加和删除彼此之间的条目。我想你可以通过共享子来克服这些事情,用于添加和删除条目,甚至可以用课程(不太了解它们)。
也许有人可以改进。
我做了,见下面的部分; - ]
Dim myDict As New Dictionary(Of String, Double)
Dim myKeyDict As New Dictionary(Of String, String)
myDict.Add("key1", 5.5)
myKeyDict.Add("key2", "key1")
' Access Dictionary with key1
myDict("key1") = 7.7
Debug.Print(CStr(myDict("key1")))
' Acces Dictionary with key2
Dim thisKey1 As String = myKeyDict("key2") ' retrieve key1 with the help of key2
Debug.Print(CStr(myDict(thisKey1))) ' Acces the actuall dictionary with the retrieved key 1
所以我为一个字典创建了一个类,其中key1为字符串,key2为字符串,val为double,基本输入和输出操作:
Public Class MultiKeyDictonaryDbl
Public DictVal As New Dictionary(Of String, Double) ' key1=Variablenname, val=Wert
Public DictKey1 As New Dictionary(Of String, String) ' key1=In/Output-Variablenname (Textdatei), key2=Variablenname
Public DictKey2 As New Dictionary(Of String, String) ' key2=In/Output-Variablenname (Textdatei), key1=Variablenname
Public length As Integer
Public Sub Add(key1 As String, key2 As String, val As Double)
DictVal.Add(key1, val)
DictKey1.Add(key1, key2)
DictKey2.Add(key2, key1)
End Sub
Public Sub Remove(key As String, id As Integer)
Dim key1 As String = Nothing
Dim key2 As String = Nothing
Dim chk As Boolean
If id = 1 Then
key1 = key
chk = DictKey1.TryGetValue(key1, key2)
ElseIf id = 2 Then
key2 = key
chk = DictKey2.TryGetValue(key2, key1)
End If
If chk = True Then
DictVal.Remove(key1)
DictKey1.Remove(key1)
DictKey2.Remove(key2)
End If
End Sub
Public Function getValue(key As String, id As Integer) As Double
Dim key1 As String = Nothing
Dim key2 As String = Nothing
Dim chk As Boolean
If id = 1 Then
key1 = key : chk = True
ElseIf id = 2 Then
key2 = key
chk = DictKey2.TryGetValue(key2, key1)
End If
If chk = True Then
chk = DictVal.TryGetValue(key1, getValue)
End If
If chk = False Then getValue = Double.PositiveInfinity
End Function
Public Function getList() As String(,)
Dim val As Double
Dim key1 As String = Nothing
Dim key2 As String = Nothing
Dim i As Integer = -1
' getLength in one line of code
length = -1 : Dim l1 As Integer = DictVal.Count : Dim l2 As Integer = DictKey1.Count : Dim l3 As Integer = DictKey2.Count : If l1 = l2 And l2 = l3 Then length = l1
If length < 1 Then Exit Function
Dim List(length - 1, 2) As String
For Each ele In DictKey2
i += 1
key2 = ele.Key : key1 = DictKey2(key2) : val = DictVal(key1)
List(i, 0) = key1 : List(i, 1) = key2 : List(i, 2) = CStr(val)
Next
getList = List
End Function
Public Function getLength() As Integer
getLength = -1
Dim l1 As Integer = DictVal.Count
Dim l2 As Integer = DictKey1.Count
Dim l3 As Integer = DictKey2.Count
If l1 = l2 And l2 = l3 Then getLength = l1
length = getLength
End Function
End Class
Sub testDictionaryVariablenVerarbeitung()
' some tests
Dim testit As New MultiKeyDictonaryDbl
testit.Add("Variablenname", "In/Output-Variablenname", 55.7)
testit.Add("Variablenname2", "In/Output-Variablenname2", 90.7)
Debug.Print(CStr(testit.getLength()))
testit.Add("Blub", "dabdi", 916)
testit.Remove("Variablenname", 1)
Dim liste(,) As String = testit.getList
Debug.Print(CStr(testit.getValue("Variablenname2", 1)))
Debug.Print(CStr(testit.getValue("dabdi", 2)))
Debug.Print(CStr(testit.getValue("dabdi", 1)))
End Sub
答案 3 :(得分:0)
有点晚了,但是如何将key1与key 2连接起来,如:
key1key2
data
有了它,您总是可以毫无麻烦地获取数据。您可以这样添加:
Public DictVal As New Dictionary(Of String, String)
DictVal.Add(key1 & key2, value)