zoukankan      html  css  js  c++  java
  • System.Linq.Dynamic字符串转委托

    以前一直想着有没有一个方法能够把字符串直接转化成函数的,刚好有需求就找了下,还真有。

    微软地址:https://docs.microsoft.com/en-us/previous-versions/bb894665(v=msdn.10)?redirectedfrom=MSDN

    一、安装

    NuGet程序管理器,System.Linq.Dynamic 

    二、应用与性能:

    class Model
    {
        public string name;
        public Model(string s)
        {
            name = s; 
        }
    }
    //创建示例数据:
    Model m1 = new Model("111");
    Model m2 = new Model("222");
    List<Model> list = new List<Model>();
    list.Add(m1);
    list.Add(m2);
    
    //普通Lambda
    list.Where(m=>m.name.StartsWith("1")).ToList();
    
    //DynamicQuery
    list.AsQueryable().Where("name.StartsWith(@0) ", "1").ToList();
    效果一样,但性能开销不同,各执行1000次循环:

     

     

    尝试其他方法,ParseLambda ,把条件单独出来获得函数委托,再调用Linq的Where。
    var lambda = DynamicExpression.ParseLambda<Model, bool>("name.StartsWith(@0)", "1");
    var fun = expfun.Compile();
    list.Where(s => fun(s)).ToList();

    运行1000次看下,虽然和原生的还有差距,但已经在可以接受的范围内了。

     

     三、其他方法:

    //DynamicExpression中还有CreateClass可以实现类的动态创建:
    var tp = DynamicExpression.CreateClass(new DynamicProperty("a", typeof(decimal)), new DynamicProperty("b", typeof(decimal)));
    var obj = Activator.CreateInstance(tp);
    tp.GetProperty("a").SetValue(obj, 12m,null);
    tp.GetProperty("b").SetValue(obj, 10m, null);
    //此时一个包含a,b属性的实例obj已经创建好,这时利用ParseLambda<T,S>就可以做到很多事情,比如根据字符串进行运算。
    var lambda = DynamicExpression.ParseLambda(tp,typeof(decimal),"a*b+2");
    var fun = lambda.Compile();
    decimal sum = (decimal)fun.DynamicInvoke(obj);
    //其他的比如根据已知类型也可进行一些想要的操作:
    DynamicExpression.ParseLambda<Model, string>("@0 + name", "名字:");

     有时string转成函数执行还是很方便的,用这个做一个计算器小程序的话,运算符解析什么的就完全不需要考虑了。

    参考链接:

    https://www.cnblogs.com/David-Qian/archive/2009/01/22/1379596.html

    https://blog.csdn.net/xuchen_wang/article/details/90749743

  • 相关阅读:
    poj 1265 Area(Pick定理)
    poj 2954 Triangle(Pick定理)
    poj 1654 Area(多边形面积)
    bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)
    227 用栈模拟汉诺塔问题
    213 字符串压缩
    212 空格替换
    211 字符串置换
    209 First Unique Character in a String
    197 排列序号
  • 原文地址:https://www.cnblogs.com/zhanglb163/p/12839040.html
Copyright © 2011-2022 走看看