Why to do,What to do,Where to do 与 Lambda表达式!
最近我做一个“四象限”图表控件,其中有一个比较复杂的“坐标变换”问题,即是如何让一组数据放到有限的一个区间内,例如有一组数据 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 表达式让我们只需要关注“做什么”,而不必关注“如何做” 。
抛弃原来的观念,使用新的“武器”吧,正所谓“君欲善其事,必先利其器 ”,我们手中有这么强大的武器,好好使用吧!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ElasticSearch索引 VS MySQL索引
- Python随机打乱列表中的元素
- Python面试题汇总
- lldb 入坑指北(3) - 打印 c++ 实例的虚函数表
- 一文让你彻底搞懂`__str__`和`__repr__`?
- lldb 入坑指北(1) - 给Xcode批量添加启用&禁用断点功能
- Xcode 中的 Workspace、Project、Target 和 Scheme
- 学习Python一年,这次终于弄懂了浅拷贝和深拷贝
- 为速度而生的构建系统 - Ninja
- Python面试题:字符串连接
- Python面试突击
- 我半夜爬了严选的女性文胸数据,发现了惊天秘密
- 二分查找(Python实现)
- 图解JavaScript——代码实现【2】(重点是Promise、Async、发布/订阅原理实现)
- 编译器 bug 系列(1)