C#linq从入门到放弃

从目前为止,如果不算html,css,sql这类的编程语言(领域特定语言,简称DSL),我一共完整的学习了两门主流的编程语言(通用编程语言,简称GPL),一个是现在靠他吃饭的家伙javascript,另一个是已经很久没写的java,因为我司后台是C#.net架构,也在后端同事的影响下开始学习大名鼎鼎的C#,同时为了拾起荒废已久的java,我把这两种语言实现同一种功能的代码都贴出来,同时加上javascript作为起头。

问题描述:把一个定长的自然序列做映射,如果是奇数就取三次方,如果是偶数就取平方

在不考虑语言特性的情况下有一个通用方法,就是用for/while迭代数组做遍历赋值,这是大部分GPL早期的写法,现在有了谷歌的map/reduce之后完全可以这么写

<!-- javascript es5 -->

var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];

var result = nums.map(
    function (x) {
        if (x % 2 == 0) {
            return x * x;
        }
        else {
            return x * x * x;
        }
    }
)

console.log("数组视图:", result);

数组视图: (14) [1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196]

这用到了js的Array对象原型中的高阶函数map,它接受一个回调函数作为参数,迭代元素并返回一个新的数组,那么在java里面又是什么情况呢

<!-- java8 -->

int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
IntStream is = Arrays.stream(nums).map(new IntUnaryOperator() {
    @Override
    public int applyAsInt(int x) {
        if (x % 2 == 0) {
            return x * x;
        } else {
            return x * x * x;
        }
    }
});

String arrayView = Arrays.toString(is.toArray());
System.out.print("数组视图:");
System.out.println(arrayView);

数组视图:[1, 4, 27, 16, 125, 36, 343, 64, 729, 100, 1331, 144, 2197, 196]

java中的数组对象没有map这个方法,需要用到stream(注意他不是IO中的流,只是借用了这个概念) ,同时使用回调接口对象做迭代操作,虽然看起来代码变多了,但是这个IntUnaryOperator实例换成lamda表达式就和js中的回调函数差不多,其他stream对象查API就行了,IDEA会给出提示不需要记忆,不能直接打印数组,所以要转成字符串,然后就是主角C#

<!-- C# .net 6.0 -->

int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };

int[] result = nums.Select(selector: x => {
    if (x % 2 == 0) {
        return x * x;
    }
    else {
        return x * x * x;
    }
}).ToArray();
Console.Write("数组视图:");
Console.WriteLine(String.Join(',', result));

数组视图:1,4,27,16,125,36,343,64,729,100,1331,144,2197,196

以我的角度来看C#的写法是最奇怪的,他用到了类似于sql里面select写法,与之类似的方法还有Groupby,Orderby,Where等等,还有一点比较怪的是,对象可以调用static方法并且把自身当成参数,在java中static方法只能由类调用,但是后面就是比较熟悉的回调函数,这种新的语法叫做linq,另外VS的语法提示也是很强大的,可以自动生成自然序列,快捷键要按几下感觉有点别扭,后面继续学习linq

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

free5156

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值