HTML5技术

C#用链式方法表达循环嵌套 - BillySir(2)

字号+ 作者:H5之家 来源:博客园 2016-06-03 11:00 我要评论( )

Run2(){Try( ,() = Try( ,() = Try( ,() = Try( ,() = Try2( ,() = Try2( ,() = Try2( ,() = Try2( , null ))))))));} Try( string name, Action action) // 第1局 { for ( int i = 0 ; i 4 ; i++ ){ if (data.IsSe

Run2() { Try(, () => Try(, () => Try(, () => Try(, () => Try2(, () => Try2(, () => Try2(, () => Try2(, null ) ) ) ) ) ) ) ); } Try(string name, Action action) //第1局 { for (int i = 0; i < 4; i++) { if (data.IsSelected(0, i)) continue; data.Selected(0, i, name); if (action == null) { Console.WriteLine(data.Current); } else { action(); } data.UnSelected(0, i); } } Try2(string name, Action action) //第2局 { for (int i = 0; i < 5; i++) { if (i == 1) continue; if (data.IsSelected(1, i)) continue; if (data.IsSelected(0, i, name)) continue; data.Selected(1, i, name); if (action == null) { data.Count++; Console.WriteLine(, data.Count, data.Current); } else { action(); } data.UnSelected(1, i); } }

结构更合理,逻辑更清晰,但是一堆lambda嵌套,太丑了,也不是我要的效果,我要的是类似这样的:

obj.Try().Try().Try().Try().Try2().Try2().Try2().Try2().Write();

四.继续向目标逼近。
由于要延迟,所以必须先把要被调用的方法的引用“告诉”上一级,当上一级执行for的时候,就能调用下一级的方法。于是我想到了一个“回调链”

所以,执行链式方法是在构造回调链,最后的方法再通过调用链头(Head)的某个方法启动真正要执行的整个逻辑。
延迟计算是从Linq借鉴和学习来的,构造Linq的过程并没有执行,等到了执行ToList, First等方法时才真正去执行。
我想构造回调链每一步都是一个固定的方法,这里随便起用了T这个极短名称,而每一步后期计算时要执行的方法可灵活指定。于是有了第3版:

Seat2(string name, Seat2 parent, Action<Seat2> method) { this.Name = name; this.Parent = parent; if (parent != null) parent.Child = this; this.Method = method; } Run() { , null, me => me.Try()) .T(, me => me.Try()) .T(, me => me.Try()) .T(, me => me.Try()) .T(, me => me.Try2()) .T(, me => me.Try2()) .T(, me => me.Try2()) .T(, me => me.Try2()) .P().Start(); } public Seat2 T(string name, Action<Seat2> method) { return new Seat2(name, this, method); } public void Try() { for (int i = 0; i < 4; i++) { if (data.IsSelected(0, i)) continue; data.Selected(0, i, this.Name); if (this.Child != null) { this.Child.Method(this.Child); } data.UnSelected(0, i); } } public void Try2() { for (int i = 0; i < 5; i++) { if (i == 1) continue; if (data.IsSelected(1, i)) continue; if (data.IsSelected(0, i, this.Name)) continue; data.Selected(1, i, this.Name); if (this.Child != null) { this.Child.Method(this.Child); } data.UnSelected(1, i); } }

五.解耦
这种调用方式,是满意了。但是运算框架与具体的算法耦合在一起,如果能把运算框架提取出来,以后写具体的算法也方便许多。于是经过苦逼的提取,测试,踩坑,最终出现了第4版:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Java 8 Lambda 表达式 - Felix_ICanFixIt

    Java 8 Lambda 表达式 - Felix_ICanFixIt

    2017-04-22 17:04

  • C# 快速高效率复制对象另一种方式 表达式树 - Emrys5

    C# 快速高效率复制对象另一种方式 表达式树 - Emrys5

    2017-04-06 14:00

  • Omi v1.0.2发布 - 正式支持传递javascript表达式 - 【当耐特】

    Omi v1.0.2发布 - 正式支持传递javascript表达式 - 【当耐特】

    2017-03-22 11:03

  • 关于ionic2打包android时gradle下载不了的解决方法(附:简单优化启动速度彩蛋) - 无所事事者爱嘲笑

    关于ionic2打包android时gradle下载不了的解决方法(附:简单优化启

    2017-03-03 13:00

网友点评
c