我对VB net相当陌生,在过去的一周里一直在玩字典。然而,当我试图用我的字典来做一些相当复杂的事情时,我遇到了一个问题。
首先,我应该指出,为了存储多个值,我正在用类对象填充字典:
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上面的代码运行,但花费的时间比我预期的要长得多,经过一些研究发现,/catch比TryGetValue花费的时间要长得多。我想做的事情(因为它是一个非常有效的函数)是使用TryGetValue。然而,据我所知,它只适用于一个键和一个值(TKey,TValue)。
有人能给我举一个例子,说明如何在多个条件下使用TryGetValue吗?
或者,如何在不占用资源的情况下捕获错误的dict查找?
我认为解决这个问题的一个好方法是使用嵌套的TryGetValue语句..。也可能是多个可以以不同方式处理此问题的数据集或列表。
我很感激你的意见!
谢谢!
发布于 2014-09-15 23:02:49
由于您使用的是函数,所以我倾向于在本例中使用函数语法,而不是查询语法。你的条件有可能不止一次匹配吗?有四种类似的方法,即First、Single、FirstOrDefault和SingleOrDefault,而且从来没有超过一个合适的情况。选择使用哪种方法可以归结为两个简单的问题:
这两个问题的答案总是告诉你调用这四种方法中的哪一种。
现在,在这种情况下,您使用的是Dictionary,对吗?钥匙是什么?我原以为NodeName会是,但我想不是。无论如何,假设您的条件将有0或1匹配,您将使用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。NodeValue属性是Double类型,所以如果有匹配,如何才能需要Double,如果没有匹配,又如何需要String?
https://stackoverflow.com/questions/25857629
复制相似问题