我是VB网络的新手,过去一周一直在玩字典。但是当我尝试用字典查找做一些相当复杂的事情时,我遇到了一个问题。
首先,我应该指出,我正在用类对象填充我的字典,以便存储多个值:
Class NodeLoad
Public Property NodeName As String
Public Property NodeCase As String
Public Property NodeAxis As String
Public Property NodeDir As String
Public Property NodeValue As Double
End Class
我的问题在于进行字典查找,我唯一的选择就是在我正在寻找的值不存在时尝试捕获:
Try
tempnodeitem = (From load In load_dict.Values Where load.NodeName = nodenum And load.NodeCase = pattern And load.NodeDir = dirarray(d)).First
loadforce(d) = tempnodeitem.NodeValue
Catch ex As Exception
loadforce(d) = "0"
End Try
以上代码运行,但需要的时间比我预期的要长,经过一些研究发现try / catch比TryGetValue长了多。我想做的事情(因为它是一个非常有效的功能)是使用TryGetValue。但是,据我所知,它仅适用于一个键和一个值(TKey,TValue)。
有人能举例说明如何在多种条件下使用TryGetValue吗?
或许如何在没有资源密集的情况下捕捉虚假的dict查找?
我认为解决这个问题的一个好方法是使用嵌套的TryGetValue语句......或者可能使用多个可以不同方式处理此问题的dicts或列表。
我感谢任何意见!
谢谢!
答案 0 :(得分:0)
当你正在使用函数时,我倾向于在这种情况下使用函数语法而不是查询语法。您的条件可能会有多个匹配吗?有四种类似的方法,即First
,Single
,FirstOrDefault
和SingleOrDefault
,并且绝不存在多个适合的情况。选择使用哪个归结为两个简单的问题:
这两个问题的答案将始终告诉您要调用的四种方法中的哪一种。
现在,在这种情况下你使用的是Dictionary
,对吧?有什么关键?我原以为NodeName
会是,但我猜不是。无论如何,假设您的条件与零或一个匹配,您将使用SingleOrDefault
。无论如何,FirstOrDefault
的代码看起来完全相同:
Dim item = myDictionary.Values.SingleOrDefault(Function(nl) nl.NodeName = nodenum AndAlso
nl.NodeCase = pattern AndAlso
nl.NodeDir = dirarray(d))
loadforce(d) = If(item Is Nothing, 0.0, item.NodeValue)
请注意代码的其他两个更正:正确使用AndAlso
代替And
以及将Double
值分配给loadforce(d)
而不是String
{1}}如果没有匹配。 NodeValue
属性的类型为Double
,那么如果匹配则如果您需要Double
?如果没有匹配则如果需要String
?