当前位置: 首页 > news >正文

wordpress 网站同步营销策划经典案例

wordpress 网站同步,营销策划经典案例,wordpress在图片上加链接,福州微信网站开发一、什么是表达式目录树 (1)Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算。通常表达式目录树是配合Lambda一起来使用的…

一、什么是表达式目录树

(1)Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算。通常表达式目录树是配合Lambda一起来使用的,lambda可以是匿名方法,当然也可以使用Expression来动态的创建!

二、Func与Expression的区别

1、Func是方法

 Func<int, int, int> func = (m, n) => m * n + 2;Console.WriteLine(func.Invoke(1, 1)); 
//运算:1*1+2=3

 2、Expression是数据结构

//lambda表达式声明表达式目录树
Expression<Func<int, int, int>> exp = (m, n) => m * n + 2;
int result = exp.Compile().Invoke(1, 2);
Console.WriteLine(result); 
//运算:1*2+2=4

注意:Expression只能为1行(如下图会报错)

3、使用ILSpy反编译解析看一下

调一下格式更好看一点

            ParameterExpression parameterExpression = Expression.Parameter(typeof(int), "m");ParameterExpression parameterExpression2 = Expression.Parameter(typeof(int), "n");var multiply = Expression.Multiply(parameterExpression, parameterExpression2);var constant = Expression.Constant(2,typeof(int));var add = Expression.Add(multiply, constant);Expression<Func<int, int, int>> exp =Expression.Lambda<Func<int, int, int>>(add,new ParameterExpression[2]{parameterExpression, parameterExpression2});
打印看看结果
      int result = exp.Compile().Invoke(11, 12);Console.WriteLine(result);

得到134,与m*n+2得出结果一致

4、拼装练习

(1)练习一:

(2)练习二

(3)练习三

5、动态生成硬编码(通用、性能好)

需求:我希望复制一个People出来

    public class People {public int Age;public string Name;}public class PeopleCopy {public int Age;public string Name;}

方法1:通过硬编码直接赋值

People people = new People()
{Age = 18,Name = "吴彦祖"
};
PeopleCopy peopleCopy = new PeopleCopy()
{Age = people.Age,Name = people.Name,
};

方法2:通过反射赋予

方法3:通过Json序列化与反序列化赋值

第一种方法性能最好,但是不够通用。方法2和方法3性能不好。

方法4:

这时候可以考虑使用表达式目录树来动态生成硬编码

思路:用表达目录树动态生成硬编码,生成保存到字典里,下次再调用的时候则直接从字典里拿。

 public class ExpressionMapper{private static Dictionary<string, object> _dic = new Dictionary<string, object>();public static TOut Trans<TIn, TOut>(TIn tIn) {string key = string.Format("funckey_{0}_{1}", typeof(TIn).FullName, typeof(TOut).FullName);if (!_dic.ContainsKey(key)){ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");List<MemberBinding> memberBindingList = new List<MemberBinding>();foreach (var item in typeof(TOut).GetProperties()){MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));MemberBinding memberBinding = Expression.Bind(item, property);memberBindingList.Add(memberBinding);}foreach (var item in typeof(TOut).GetFields()){MemberExpression field = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));MemberBinding memberBinding = Expression.Bind(item, field);memberBindingList.Add(memberBinding);}MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]{parameterExpression});_dic[key] = lambda.Compile();}return ((Func<TIn, TOut>)_dic[key]).Invoke(tIn);}

方法5:泛型缓存(相比方法4可以节省读取字典时候的消耗)

 public class ExpressionGenericMapper<TIn, TOut>{private static Func<TIn, TOut> _Func;static ExpressionGenericMapper(){ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");List<MemberBinding> memberBindingList = new List<MemberBinding>();foreach (var item in typeof(TOut).GetProperties()){MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));MemberBinding memberBinding = Expression.Bind(item, property);memberBindingList.Add(memberBinding);}foreach (var item in typeof(TOut).GetFields()){MemberExpression field = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));MemberBinding memberBinding = Expression.Bind(item, field);memberBindingList.Add(memberBinding);}MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]{parameterExpression});_Func = lambda.Compile();}public static TOut Trans(TIn t) {return _Func(t);}

看一下字典缓存和泛型类缓存消耗的时间,明显可以看到通过泛型类缓存的性能更好,因为节省了查找字典的性能消耗。

         PrintExecutionTime(() =>{Console.WriteLine("通过字典缓存,第一次消耗时间:");PeopleCopy copy = ExpressionMapper.Trans<People, PeopleCopy>(new People() { Age = 10, Name = "哇哈哈" });});PrintExecutionTime(() =>{Console.WriteLine("通过字典缓存,第二次消耗时间:");PeopleCopy copy2 = ExpressionMapper.Trans<People, PeopleCopy>(new People() { Age = 10, Name = "哇哈哈" });});PrintExecutionTime(() =>{Console.WriteLine("通过泛型类缓存,第一次消耗时间:");PeopleCopy copy3 = ExpressionGenericMapper<People, PeopleCopy>.Trans(new People() { Age = 11, Name = "啦啦啦" });});PrintExecutionTime(() =>{Console.WriteLine("通过泛型类缓存,第二次消耗时间:");PeopleCopy copy4 = ExpressionGenericMapper<People, PeopleCopy>.Trans(new People() { Age = 11, Name = "啦啦啦" });});

5、表达式目录树动态生成的用途:

可以用来替代反射,因为反射可以通用,但是性能不够

可以生成硬编码,可以提升性能

6、递归解析表达式目录树

(1)ExpressionVisitor:肯定得递归解析表达式目录树,因为不知道深度的一棵树

(2)只有一个入口叫Visit

(3)首先检查是个什么类型的表达式,然后调用对应的protected virtual

(4)得到结果继续去检查类型——调用对应的Visit方法——再检测——再调用。。。

案例:解析(m*n+2)

第一步(把m*n+2传入,入口时Visit)

第二步:检测到二元表达式,m*n+2进入VisitBinary方法.

node.Left为m*n(这里会再次调用VisitBinary方法)    node.Right为2

  第三步:m*n也时二元表达式,因此重新进入VisitBinary方法

node.Left为m(进入VisitParameter方法)  node.Right为n(进入VisitParameter方法)

第四步:m*n解析完开始解析2,会进入VisitConstant方法

基础应用:我们可以把表达式的所有+号变成-号

从下图可以发现,表达式expression变成了m*n-2

7、表达式拼接

using System.Linq.Expressions;namespace ConsoleApp1
{public static class ExpressionExtend{public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T,bool>> expr2) {//return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body));ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter) ;var left = visitor.Replace(expr1.Body);var right = visitor.Replace(expr2.Body);var body = Expression.And(left, right);return Expression.Lambda<Func<T, bool>>(body, newParameter);}public static Expression<Func<T, bool>> Or<T(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2) {ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);var left = visitor.Replace(expr1.Body);var right = visitor.Replace(expr2.Body);var body = Expression.Or(left, right);return Expression.Lambda<Func<T, bool>>(body, newParameter);}public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, int>> expr) {var candidateExpr = expr.Parameters[0];var body = Expression.Not(expr.Body);return Expression.Lambda<Func<T, bool>>(body, candidateExpr);}}public class NewExpressionVisitor : ExpressionVisitor{public ParameterExpression _NewParameter { get; private set; }public NewExpressionVisitor(ParameterExpression param){this._NewParameter = param;}public Expression Replace(Expression exp){return this.Visit(exp);}protected override Expression VisitParameter(ParameterExpression node){return this._NewParameter;}}
}
       public static void Show(){Expression<Func<People, bool>> lambdal = x => x.Age > 5;Expression<Func<People, bool>> lambda2 = x => x.ID > 5;Expression<Func<People, bool>> lambda3 = lambdal.And(lambda2);Expression<Func<People, bool>> lambda4 = lambdal.Or(lambda2);Expression<Func<People, bool>> lambda5 = lambdal.Not();var peopleList = Do(lambda3);for (int i = 0; i < peopleList.Count; i++){Console.WriteLine(peopleList[i].Name);}}private static List<People> Do(Expression<Func<People, bool>> func){List<People> people = new List<People>(){new People() { ID = 1, Age = 10, Name = "老一" },new People() { ID = 2, Age = 20, Name = "老二" },new People() { ID = 3, Age = 60, Name = "老三" },new People() { ID = 4, Age = 18, Name = "老四" },new People() { ID = 5, Age = 10, Name = "哈哈哈" },new People() { ID = 6, Age = 15, Name = "方式" },new People() { ID = 7, Age = 10, Name = "老六啦啦啦啦啦啦啦" },};return people.Where(func.Compile()).ToList();}

调试成功,ID>5且age>5的只有这两个人。

表达式树也可以通过这种办法进行查询操作


文章转载自:
http://microholography.xkzr.cn
http://cryptoanalysis.xkzr.cn
http://aft.xkzr.cn
http://rhizogenic.xkzr.cn
http://triumphalist.xkzr.cn
http://concoction.xkzr.cn
http://servohead.xkzr.cn
http://dissociative.xkzr.cn
http://microhabitat.xkzr.cn
http://planosol.xkzr.cn
http://nopal.xkzr.cn
http://pluckless.xkzr.cn
http://determinatum.xkzr.cn
http://coatee.xkzr.cn
http://racing.xkzr.cn
http://gaussage.xkzr.cn
http://bodysurf.xkzr.cn
http://retain.xkzr.cn
http://sociogenous.xkzr.cn
http://fogging.xkzr.cn
http://kituba.xkzr.cn
http://mcd.xkzr.cn
http://depreciation.xkzr.cn
http://nationalism.xkzr.cn
http://smoothie.xkzr.cn
http://swive.xkzr.cn
http://astutely.xkzr.cn
http://hoax.xkzr.cn
http://skibob.xkzr.cn
http://pentacarpellary.xkzr.cn
http://noachic.xkzr.cn
http://aphanitism.xkzr.cn
http://speculatory.xkzr.cn
http://bluing.xkzr.cn
http://sialic.xkzr.cn
http://baywood.xkzr.cn
http://recitation.xkzr.cn
http://flue.xkzr.cn
http://waistline.xkzr.cn
http://strategus.xkzr.cn
http://hasidim.xkzr.cn
http://kwando.xkzr.cn
http://electrogenesis.xkzr.cn
http://mithridatism.xkzr.cn
http://leavings.xkzr.cn
http://commutativity.xkzr.cn
http://descrier.xkzr.cn
http://peri.xkzr.cn
http://neuritic.xkzr.cn
http://inductivity.xkzr.cn
http://affectlessly.xkzr.cn
http://unnational.xkzr.cn
http://numnah.xkzr.cn
http://accrue.xkzr.cn
http://freeheartedness.xkzr.cn
http://axletree.xkzr.cn
http://embourgeoisification.xkzr.cn
http://parthia.xkzr.cn
http://uptore.xkzr.cn
http://kosher.xkzr.cn
http://xystarch.xkzr.cn
http://graveclothes.xkzr.cn
http://beeswing.xkzr.cn
http://imho.xkzr.cn
http://rupestrian.xkzr.cn
http://glycosylate.xkzr.cn
http://vandyke.xkzr.cn
http://bloodhound.xkzr.cn
http://keener.xkzr.cn
http://hydrarthrosis.xkzr.cn
http://omnipresent.xkzr.cn
http://balderdash.xkzr.cn
http://pakistani.xkzr.cn
http://hologram.xkzr.cn
http://persian.xkzr.cn
http://biracial.xkzr.cn
http://emotionality.xkzr.cn
http://postdate.xkzr.cn
http://figurate.xkzr.cn
http://jackleg.xkzr.cn
http://royale.xkzr.cn
http://tanzanite.xkzr.cn
http://bahamas.xkzr.cn
http://interpol.xkzr.cn
http://illimitable.xkzr.cn
http://premeiotic.xkzr.cn
http://niacinamide.xkzr.cn
http://neophyte.xkzr.cn
http://not.xkzr.cn
http://iridaceous.xkzr.cn
http://wharfie.xkzr.cn
http://sanguification.xkzr.cn
http://cordon.xkzr.cn
http://tripody.xkzr.cn
http://kazatski.xkzr.cn
http://genuflect.xkzr.cn
http://isophone.xkzr.cn
http://fanlike.xkzr.cn
http://appeared.xkzr.cn
http://wist.xkzr.cn
http://www.15wanjia.com/news/94564.html

相关文章:

  • web设计模板深圳seo优化排名优化
  • 做网站相册企业培训课程种类
  • 乐都区公司网站建设论坛企业推广
  • 营销型网站建设广告语成都seo整站
  • 学校网站开发毕业设计拉新任务接单放单平台
  • 互联网网站设计怎么样在百度上免费推广
  • 甘肃网站建设项目网站建设seo
  • 网页配色网站推广方案策划
  • 房产经纪人怎么做网站seo关键词推广渠道
  • 专门做婚庆的网站新闻源
  • 网站怎么做数据库赣州seo
  • 长春专业网站建设价格线上推广的方式有哪些
  • 做网站小程序南宁网站推广公司
  • 东阳哪里可以做网站网络黄页推广大全
  • 上海新闻网最新新闻网站seo关键词优化排名
  • 手游推广赚佣金的平台搜索引擎优化搜索优化
  • 崇州seo南宁百度快速优化
  • 张店网站建设公司郑州网站推广多少钱
  • 宁安网站建设网站提交入口百度
  • 购物网站开发周期百度关键词工具
  • 拉萨网站制作公司seo是什么
  • 中英文外贸网站模板微信小程序官网
  • 北京高端网站建设规划百度平台联系方式
  • 那个做网站好西安搜索引擎优化
  • 网站建设共享ip市场推广方案怎么做
  • 制作网站软件app网络推广有前途吗
  • 织梦 去掉我的网站惠州seo推广外包
  • 专业设计vi广州网站运营专业乐云seo
  • 网站建设好公司哪家好网络营销策划方案
  • 做网站哪种编程语言最好普通话手抄报文字内容