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 表达式让我们只需要关注“ 做什么”,而不必关注“ 如何做” 。

抛弃原来的观念,使用新的“武器”吧,正所谓“ 君欲善其事,必先利其器 ”,我们手中有这么强大的武器,好好使用吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值