如何将此代码转换为表达式树?

时间:2010-02-12 15:00:35

标签: .net vb.net expression-trees

我有一个散列方法,其操作取决于函数的输入。对程序进行分析表明,花费了太多时间来评估这种哈希方法。我想尝试将其更改为表达式树,因此内部循环检查可以完成一次。希望它会更快,但无论如何我都会学习表达树。

这是函数的简化版本(我为示例解除了一些明显的优化,并取消了任何输入验证):

Private Function Checksum(ByVal inputValues As IEnumerable(Of UInt32),
                          ByVal declarations As IEnumerable(Of String),
                          ByVal statements As IEnumerable(Of String)) As UInt32
    Dim variables = New Dictionary(Of Char, UInt32)

    For Each declaration In declarations
        'parse declaration (eg. "X=52")'
        variables(declaration(0)) = UInt32.Parse(declaration.Substring(2))
    Next declaration

    For Each value In inputValues
        '"I"nput'
        variables("I"c) = value

        For Each statement In statements
            'parse statement (eg. "X=Y+Z")'
            Dim varResult = statement(0)
            Dim valueLeft = variables(statement(2))
            Dim operand = statement(3)
            Dim valueRight = variables(statement(4))

            'execute statement'
            Dim valueResult As UInt32
            Select Case operand
                Case "+"c : valueResult = valueLeft + valueRight
                Case "-"c : valueResult = valueLeft - valueRight
                Case "*"c : valueResult = valueLeft * valueRight
                Case "&"c : valueResult = valueLeft And valueRight
                Case "|"c : valueResult = valueLeft Or valueRight
                Case "^"c : valueResult = valueLeft Xor valueRight
            End Select
            variables(varResult) = valueResult
        Next statement
    Next value

    '"O"utput'
    Return variables("O"c)
End Function

我想创建一个函数,它接受声明和语句,并输出一个专门的表达式树,表示一个函数,它接受一个I​​Enumerable的UInt32并返回一个UInt32。


后续:

我成功了,加速荒谬(一个数量级)。我必须学习的主要内容:

  • 使用Expression.Lambda和Expression.Compile获取实际可以使用的委托。
  • Expression.Block工厂方法有一个'变量'参数,您(本质上)用于声明本地。同样,Expression.lambda有'parameters'。
  • 如果你两次调用Expression.Parameter,你就会处理两个不同的变量(即使它们的名字相同)!存储结果以供以后使用。标签等相同
  • BlockExpression的结果是块中的最后一个表达式。

1 个答案:

答案 0 :(得分:2)

VS 2010 RC有一个文档更新。我在这里添加了一些关于新ET API的示例:http://msdn.microsoft.com/en-us/library/bb397951(VS.100).aspx 它显示了如何创建局部变量以及如何执行表达式树。示例包括VB和C#。

但老实说,我仍然不明白你想做什么。为什么声明和语句以字符串形式出现?而这个OpToExp功能对我来说也是一个谜。你是如何设法将操作数作为表达式,但操作符(由于某种原因你称之为“操作数”)作为char? 如果您提供有关您要执行的操作以及系统整体设计的更多信息,我可能会帮助您更好。