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

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

  • 相关阅读:
    [Java]用于将链表变成字符串并在元素之间插入分隔符的有用函数“String.join”
    Sql语法树示例 select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1
    [Java]一段尚未雕琢的分词代码
    day44_Oracle学习笔记_03
    day43_Oracle学习笔记_02
    WinXP系统中的Oracle数据库如何以管理员身份登录
    Oracle 10G安装指导
    20个Linux服务器性能调优技巧
    Linux 上使用 Gmail SMTP 服务器发送邮件通知
    Netdata Linux下性能实时监测工具
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/1865971.html
Copyright © 2020-2023  润新知