专栏首页程序员的SOD蜜Why to do,What to do,Where to do 与 Lambda表达式!

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 条评论
登录 后参与评论

相关文章

  • 同样的SQL语句在查询分析器执行很快,但是网站上执行超时的诡异问题

        同样的SQL语句在查询分析器执行很快,但是网站上执行超时,这个问题以前遇到过,解决办法是重新启动服务器,但过一段时间后(时间长短不一定,一般为一天后),...

    用户1177503
  • 在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++/CLI

    在.NET与C++之间传输集合数据 上一篇《在C++中反射调用.NET(二)》中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与...

    用户1177503
  • 使用操作符重载,生成ORM实体类的SQL条件语句

    ORM框架的一个不可或缺的功能就是根据实体类,生成操作数据库的SQL语句,这其中,最难处理的就是那些复杂的SQL条件比较语句。比如,有下面这样一个SQL语句: ...

    用户1177503
  • List与List<?>的区别何在

    泛型是Java最基础的语法之一,不过这种语法依然有值得一说的地方:如果仅停留在泛型的基本使用上,泛型当然很简单;但如果从字节码层次来看泛型,将会发现更多泛型的本...

    疯狂软件李刚
  • JAVA 泛型

    命名类型参数 推荐的命名约定是使用大写的单个字母名称作为类型参数。这与 C++ 约定有所不同(参阅 附录 A:与 C++ 模板的比较),并反映了...

    用户1688446
  • Scala入门学习笔记四--List使用

    前言 本篇将介绍一个和Array很相似的集合List,更多内容请参考:Scala教程 本篇知识点概括 List的构造 List与Array的区别 Lis...

    用户1174963
  • java每日一题20201006

    大家好,我是向同学,从今天继续每日一题,旨在为提高大家的基础知识。话说干了这么多年的开发,只知道会用,怎么用,用什么,隐约也知道了为什么用,但为啥JAVA总像一...

    用户7656790
  • Java工具集-集合(CollectionUtils)

    cwl_java
  • Android高德之旅(17)出行路线规划废话简介总结

    今天这篇来记录一下地图SDK中非常重要的一个功能:出行路线规划。我相信高德地图使用最多的也就是这个功能了,当然,我们今天的内容可能还做不到高德地图那么丰富的效果...

    大公爵
  • Java中5种List的去重方法及它们的效率对比,你用对了吗?

    来源:blog.csdn.net/qq3434569/article/details/100520524

    JAVA葵花宝典

扫码关注云+社区

领取腾讯云代金券