表达式树使用(四)

如果不真正放下过去,就不会有明天。


Program.cs

 class Program
    {
        static void Main(string[] args)
        {
            string[] companies = {"综合即时通","高山滑雪之家","绍斯里奇","城市电力和照明",
             "Coho酒庄","世界各地的入侵者","平面设计学院","冒险工程",
             "Humongous保险","Woodgrove银行","Margie的旅行","Northwind贸易商",
             "Blue Yonder航空公司","Trey研究","电话公司", "翼尖玩具","卢塞恩出版","第四届咖啡"};

            //要查询的IQueryable数据
            IQueryable<String> queryableData = companies.AsQueryable<string>();

            //表达式树参数
            ParameterExpression pe = Expression.Parameter(typeof(string), "company");

            //-------------------------------------------------------------------------------------------------------
            //Where(company => (company.ToLower() == "coho酒庄" || company.Length > 8))

            //创建一个 MethodCallExpression,它表示对不带参数的实例方法的调用。
            //创建表示表达式“company.ToLower()=="coho酒庄“"的表达式树。
            Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
            Expression right = Expression.Constant("coho酒庄");
            Expression e1 = Expression.Equal(left, right);

            //创建表示表达式“company.Length> 8"的表达式树
            left = Expression.Property(pe, typeof(string).GetProperty("Length"));
            right = Expression.Constant(8, typeof(int));
            Expression e2 = Expression.GreaterThan(left, right);

            //创建一个 BinaryExpression,它表示仅在第一个操作数的计算结果为 false 时才计算第二个操作数的条件
            //组合表达式树以创建表示表达式“(company.ToLower()=="coho酒庄“|| company.Length> 8)"的表达式树。
            Expression predicateBody = Expression.OrElse(e1, e2);

            //创建表示表达式“queryableData.Where(company =>(company.ToLower()=="coho酒庄“|| company.Length> 8)"的表达式树。
            MethodCallExpression whereCallExpression = Expression.Call(
                typeof(Queryable),
                "Where",
                new Type[] { queryableData.ElementType },
                queryableData.Expression,
                Expression.Lambda<Func<string, bool>>(predicateBody, new ParameterExpression[] { pe }));
   

            //-------------------------------------------------------------------------------------------------------
            //创建表示表达式的表达式树'whereCallExpression.OrderBy(company => company)'
            MethodCallExpression orderByCallExpression = Expression.Call(
                typeof(Queryable),
                "OrderBy",
                new Type[] { queryableData.ElementType, queryableData.ElementType },
                whereCallExpression,
                Expression.Lambda<Func<string, string>>(pe, new ParameterExpression[] { pe }));



            //-------------------------------------------------------------------------------------------------------


            //从表达式树创建可执行查询。
            IQueryable<string> results = queryableData.Provider.CreateQuery<string>(orderByCallExpression);

            //枚举结果
            foreach (string company in results)
            {
                Console.WriteLine(company);
            }

            Console.ReadLine();
          
        }
    }

运行结果如图:

这里写图片描述

### 回答1: Java表达式是一种数据结构,它用于表示数学表达式,并且可以方便地计算这些表达式。下面是一个简单的Java程序,用于计算一个包含加、减、乘、除种运算符的表达式: ```java import java.util.Stack; public class ExpressionTree { private Node root; private class Node { public String value; public Node left, right; public Node(String value) { this.value = value; this.left = null; this.right = null; } } public ExpressionTree(String expression) { Stack<Node> stack = new Stack<Node>(); String[] tokens = expression.split(" "); for (String token : tokens) { if (isOperator(token)) { Node right = stack.pop(); Node left = stack.pop(); Node node = new Node(token); node.left = left; node.right = right; stack.push(node); } else { Node node = new Node(token); stack.push(node); } } root = stack.pop(); } public double evaluate() { return evaluate(root); } private double evaluate(Node node) { if (node == null) return 0; if (node.left == null && node.right == null) return Double.parseDouble(node.value); double left = evaluate(node.left); double right = evaluate(node.right); switch (node.value) { case "+": return left + right; case "-": return left - right; case "*": return left * right; case "/": return left / right; default: return 0; } } private boolean isOperator(String token) { return token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/"); } public static void main(String[] args) { ExpressionTree tree = new ExpressionTree("5 1 2 + 4 * + 3 -"); System.out.println(tree.evaluate()); } } ``` 这个程序可以计算任意一个包含加、减、乘、除种运算符的表达式,并且输出计算结果。例如,上面的main方法会输出16.0,因为这个表达式的计算结果是5 + (1 + 2) * 4 - 3 = 16. ### 回答2: Java表达式计算是一种将表达式转换为形结构并进行计算的方法。首先,通过解析表达式,可以将其转换为型结构,该结构由节点和连接它们的边组成。节点可以是操作符或操作数,并且每个操作符节点都有子节点,表示它的操作数。 在计算表达式时,我们可以使用递归的方法遍历整个。从根节点开始,我们检查当前节点的类型是操作符还是操作数。如果是操作数节点,则直接返回其值。如果是操作符节点,则递归计算其子节点的值,并根据操作符的类型对子节点的值进行相应的操作。 例如,假设我们有一个表达式的根节点是一个"+"节点,其左子节点是一个数字节点2,右子节点是一个数字节点3。在计算表达式时,我们首先递归计算左子节点的值,得到2,然后递归计算右子节点的值,得到3。最后,根据操作符节点的类型执行加法操作,并将结果返回。 通过递归遍历整个表达式,我们可以计算任意复杂度的表达式。这种方法的优势是可以对表达式进行灵活的解析和计算,可以处理各种类型的操作符和操作数,并且能够处理嵌套和多层级的表达式。 总而言之,Java表达式计算是一种将表达式转换为形结构并进行计算的方法,通过递归遍历整个表达式,可以计算任意复杂度的表达式。这种方法具有灵活性和扩展性,可以处理各种类型的操作符和操作数,并且能够处理嵌套和多层级的表达式。 ### 回答3: Java表达式计算是一种将数学表达式转化为二叉表示,并以结构进行计算的方法。该方法可以有效地解决复杂的数学运算问题。 在表达式中,每个节点都代表着一个操作符或者操作数。操作符节点有左子节点和右子节点,而操作数节点没有子节点。通过将数学表达式构建为表达式,我们可以很方便地对表达式进行计算。 计算表达式的过程,通常是通过递归算法实现的。首先,我们从根节点开始遍历整个,如果当前节点是操作数节点,直接返回该节点的值。如果当前节点是操作符节点,则需要对其左子和右子进行递归计算,并根据操作符节点的运算规则对子结果进行运算,得到最终的计算结果。 通过表达式计算,我们可以实现对复杂的数学表达式的计算,包括加减乘除以及各种嵌套运算的组合。这种方法可以提高计算效率,减少重复计算的次数,提升程序性能。 总之,Java表达式计算是一种将数学表达式转化为结构,并通过递归算法对进行计算的方法。它可以方便地解决复杂的数学运算问题,提高程序的计算效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值