使用具有多个条件的字典TryGetValue

时间:2014-09-15 22:03:32

标签: vb.net dictionary

我是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或列表。

我感谢任何意见!

谢谢!

1 个答案:

答案 0 :(得分:0)

当你正在使用函数时,我倾向于在这种情况下使用函数语法而不是查询语法。您的条件可能会有多个匹配吗?有四种类似的方法,即FirstSingleFirstOrDefaultSingleOrDefault,并且绝不存在多个适合的情况。选择使用哪个归结为两个简单的问题:

  1. 总会有至少一场比赛吗?如果没有,那么使用以“OrDefault”结尾的那个。
  2. 会不会有多场比赛?如果没有,请使用以“Single”开头的。
  3. 这两个问题的答案将始终告诉您要调用的四种方法中的哪一种。

    现在,在这种情况下你使用的是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