最近我做一个“四象限”图表控件,其中有一个比较复杂的“坐标变换”问题,即是如何让一组数据放到有限的一个区间内,例如有一组数据 List[4,5,6,7,8],要求放到一个画布的像素区间 Area[20,300] ,我们来看看怎么解决这个问题。
Why to do:
首先需要分析问题,找到解决问题的方法,也就是“算法”,我们来推导一下(下面的推导过程采用伪代码):
目标:
List:4==Area:20;
List:8==Area:300; 
开始变换过程:
Area => Area![0,280];
offset=20; //区域的偏移量
List_min =4,List_max=8;
List_suba=List_max - List_min =4;//边界差
// Area! 应该在边界差之中被平均分配,这个平均值简称刻度值
p_suba=Area!:max / List_suba =280 / 4 =70;//刻度值 
// 所以可以求得最终的值列表:
List![i]=(List[i]-List_suba) * p_suba; //i=[0..List.Length]
=> List!=[0,70,140,210,280];//符合区间值要求
// 最终的结果应该加上区域的偏移量 offset
=> List!![i]=List![i]+offset;//i=[0..List!.Length]
//  所以最终结果应该是:  List!!=[20,90,160,230,300];

What to do:
从这个推导过程可以看出,我们要做的工作有:
1,取得列表的最大、最小值;
2,求得单位刻度值;
3,循环处理列表元素,计算出最终结果。
Where to do:
OK ,算法我们知道了,要做什么也知道了,剩下的就是具体怎么做了,开始写代码了,写个循环取最大值,再写个循环取最小值,再写两个循环处理列表元素,看来得写N多循环啊!
。。。
等待,这写代码就不要写了吧,累不累啊?
不写怎么行?
可以,.NET 的 Lambda表达式就性,不要去思考“Where to do” 的问题了!
Lambda表达式 上场:
其它都不说了,有了上面的算法,直接上代码:
 /// <summary>
        /// 区域变换,将values中的每个元素的值转变成在区域Area[area_min,area_max]中有效的值
        /// </summary>
        /// <param name="area_min">区域的最小值</param>
        /// <param name="area_max">区域的最大值</param>
        /// <param name="values">要处理的值列表</param>
        /// <returns>在区域内的新值列表</returns>
        private Single[]  AreaTransform(int area_min,int area_max,Single[] values)
        {
            int offset = area_max - area_min;
            Single List_min = values.Min();
            Single List_max = values.Max();
            Single List_suba = List_max - List_min;
            Single p_suba = (area_max - offset) / List_suba;
            List<Single> List1 = values.ToList();
            List1.ForEach(i => i = (i - List_suba) * p_suba);
            List1.ForEach(i => i = i + offset);
            return List1.ToArray ();
        }

=======================

看到了吗?一行 foreach(...){...} 都没有写,我们的代码就是我们的算法本身,Lambda 表达式让我们只需要关注“做什么”,而不必关注“如何做” 。
抛弃原来的观念,使用新的“武器”吧,正所谓“君欲善其事,必先利其器 ”,我们手中有这么强大的武器,好好使用吧!

Why to do,What to do,Where to do 与 Lambda表达式!相关推荐

  1. aws lambda使用, aws无服务器部署应用。 aws ecr凭证获取和使用。

    这里演示的是使用docker镜像进行服务创建 使用镜像进行创建服务 镜像上传 1. 先申请access key 和secret 登录aws控制台,右上角个人那里点击security credentia ...

  2. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

  3. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  4. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  5. 用伪代码模拟洗衣机的运转流程

    今天的软导课又学到了不少"骚操作",其中就包括Pseudocode和Top-down design. 不如现在就借着介绍洗衣机的运转流程向大家介绍一下这两个简单的东西. 题目如下 ...

  6. java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】

    类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...

  7. 广东java工资一般多少_广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少...

    广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少 首页 > java > 广东java工资待遇 作者:镀金池   发布时间:2018-12-22 11:20 在 ...

  8. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  9. lisp协议instand_分享|Linux 上 10 个最好的 Markdown 编辑器

    在这篇文章中,我们会点评一些可以在 Linux 上安装使用的最好的 Markdown 编辑器. 你可以在 Linux 平台上找到非常多的 的 Markdown 编辑器,但是在这里我们将尽可能地为您推荐 ...

  10. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

最新文章

  1. python ocr中文识别库 tesseract安装及问题处理
  2. ffmpeg基本用法(转)
  3. Java高级-线程同步lock与unlock使用
  4. java对象实例_深入理解Java对象实例生成的例子!(转)
  5. iptables之NAT
  6. 多系统引导工具支持Linux,多系统引导工具(BootThink)
  7. 鸿蒙专属ota升级真机,鸿蒙OS手机开发者Beta版发布,华为P40、Mate 30系列优先公测...
  8. Oracle的重做日志
  9. sh文件执行的时候卡住的可能原因
  10. .rgb格式文件的Python读取、格式转换
  11. 小米笔记本bios版本大全_RedmiBook 14笔记本评测:初来乍到却熟路轻辙
  12. (KNN)K-近邻算法介绍和 Facebook签到位置预测案例应用
  13. Android项目实战(八):列表右侧边栏拼音展示效果
  14. html怎么改表格背景,javascript修改表格背景色实例代码分享
  15. html中易混淆的offset、client、scroll
  16. 使用计算机视觉来做异常检测
  17. Linux下Graphite的安装及部署
  18. scala函数自我小结(待更新)
  19. 【Python】turtle小海龟画兔子
  20. java输入整型数据_怎样用Java输入一个整形数据以及山中循环的使用

热门文章

  1. C# ConfigurationManager不存在问题解决
  2. Android学习CursorWrapper与Decorator模式
  3. KingPaper初探Java之方法声明及重载
  4. Oracle 11gR1中细粒度拜候搜集效劳(2)
  5. 自动识别HTML代码里的图片链接,并下载到服务器的指定目录(开源)
  6. mysql启动失败的一个解决方法
  7. 没有数据的MySql导出架构
  8. sed和awk有什么区别? [关闭]
  9. 了解Java中的检查与未检查异常
  10. const int *,const int * const和int const *有什么区别?