首页 > 其他分享 >为什么大多数语言都不支持LINQ机制?

为什么大多数语言都不支持LINQ机制?

时间:2023-12-18 21:59:25浏览次数:33  
标签:Java 语言 C# LINQ 特性 解决 大多数

C# 3.0可以说是C#历史上最大的一次改动,从语言到库的层面可以说是做了革命性的变化,单单是上下文关键字,就一次性新增了from、where、select、group、by、join、equals、on、let、order、into、asscending、descending一大堆,加上原有的in啥的。这特么就是重新设计了一个新的语言。

而C#为了支持LINQ Expression,从语言到库都是进行了一系列的改造:

为了解决select投影出一个新的元组的问题,引入了匿名对象。

为了解决查询条件直接编写在表达式里面的问题,引入了lambda表达式

为了解决在现有集合上新增查询功能,引入了扩展方法

为了解决内置集合查询问题,引入了Enumerable扩展类。

为了解决分组聚合问题,引入了IGrouping、ILookup和一系列聚合方法

为了解决INNER JOIN和OUTER JOIN,引入了GroupJoin、FirstOrDefault等一系列扩展方法

为了解决CROSS JOIN,引入了SelectMany

为了解决排序问题,引入了OrderBy和OrderByDescending

为了解决扩展方法查询不好看的问题,引入了上面所说的一大堆关键字和LINQ Expression。

为了解决LINQ查询映射为数据库查询的问题,引入了ExpressionTree(C#历史上最重要的特性)。

为了解决C#没有alias或者immutable value的问题,甚至还增加了let表达式

…………

 

Java在Java 8一口气抄了Lambda表达式和接口默认实现(解决扩展方法问题),但是没有元组的替代品。就算最新的Java已经支持了record类型,但是匿名类型和元组并不需要事先命名,所以仍然无法写出流畅的select,更何况因为Java没有值类型的泛型(基因问题),所以一些很简单的表达式也会困难重重。

 

至于最近被吹上天的StringTemplate用来写SQL。

我在八年前就特么用C#的模板字符串实现了……更别说十五年前的LINQ……

 

 

======================================================

pizzacompiler.sourceforge.net这是scala作者马丁奥德斯基和haskell类型类的作者Phil Wadler在1996年给java做的方言,把泛型、高阶函数、模式匹配带到了java上,这个东西就是后来java5和java8的前身。

只能说,Java目前的程序员的水准的确是越来越差了,本不想回应这种言论,但想想,还是有一个问题我们一起讨论一下:

 

事实上你在目前流行的程序设计语言中随便挑一个出来,你说这个语法是不是它独创的?这几乎是不可能的事情,类似的语法或者特性必然在其他语言中出现过。毕竟设计一个程序设计语言在很多学校是毕业前要做的一个功课。

 

那么,我们凭什么说,Java8的这个特性就是抄C#的呢?

为什么不能说,这位仁兄说的pizza不是被C#抄袭了呢?

 

 

我们不妨来考虑这样一个言论:

LINQ不就是抄的SQL的语法么?

 

 

我想不会有太多人认同这种说法。要不然我们回到提问者的问题,对啊,就是抄SQL的语法,你倒是抄啊,为啥你不抄呢?

 

所以,我们谈到一个语言特性的时候,我们说其它语言中的类似特性到底多大程度上受到这个语言影响的时候。

我认为要看三个方面:开创性、实用性、普及性。

 

开创性毋庸多言,即这个特性是第一次出现在这个语言中,可能是语法形式,可能是概念,可能是用法,可能是搭配。但正如上面说的,事实上很少有语言会有完全的开创性。

实用性即是指这个特性有非常实用的场景,任何语言特性都不是凭空出现的,必然是为了解决具体的问题,那么这些问题就必然有具体的场景。如果一个特性不解决任何实际的问题,没有具体的应用场景,那么这个特性和每年都被创造出来的成千上万的语言一样毫无价值。

普及性也无须多言,正如同我之前说的,目前流行的程序语言都有一个共同的特征就是运气好,运气本来就是语言流行的很重要的一个点。一个特性在某个语言具备开创性也有实用性,但是这个语言运气不好,没有普及开来,那也不会被人记住。

 

了解了这三点,我们来看为什么我们可以说Java8就是抄的C#。

很简单,我们看看Java8除了加入Lambda之外还加入了哪些东西不就知道了吗?

我们看看Lambda主要的应用场景是什么不就知道了吗?

当然你要是Java搞多了致盲,

您说的对……

 

全世界都是抄的JVM的。

 

 

按照这种逻辑,我还说Java抄的COM呢,那个Object就是IUnknow

标签:Java,语言,C#,LINQ,特性,解决,大多数
From: https://www.cnblogs.com/sexintercourse/p/17912367.html

相关文章

  • C 语言:类型转换与常量的细致理解
    C语言中的类型转换有时,您必须将一种数据类型的值转换为另一种类型。这称为类型转换隐式转换当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换。例如,如果您将一个int值分配给一个float类型://自动转换:inttofloatfloatmyFloat=9;printf("%f",......
  • 大语言模型微调数据竞赛,冠军!
     近日,天池FT-DataRanker竞赛落下帷幕,天翼云智能边缘事业部AI团队(后称天翼云AI团队)凭借在大语言模型(LLM)训练数据增强方面的卓越研究,荣获大语言模型微调数据竞赛——7B模型赛道冠军。  FT-DataRanker竞赛是一场面向大语言模型研究、以数据为中心的竞赛,吸引了包括来自北京大......
  • 大语言模型与传统机器学习的架构差异性解析
    在人工智能领域,架构设计是决定一个模型性能和应用范围的关键因素。大语言模型和传统机器学习有不同的设计框架,使得它们在应用场景和处理任务上具有显著差异。大语言模型,如GPT和BERT,基于庞大而复杂的神经网络结构构成,这些神经网络结构拥有数百万甚至数十亿的参数,能够学习和理解大量......
  • 【C语言】puts()字符串输出函数 | 自动换行
    ......
  • linq和lambda
    LINQ:LINQ(LanguageIntegratedQuery)是.NETFramework3.5中引入的一个功能,它提供了一种统一的查询语法,使得我们可以在C#代码中直接使用类似SQL的查询语句来查询和操作各种数据源,如集合、数据库、XML等。LINQ使用标准查询运算符(如Where、Select、OrderBy等)来完成查询任务......
  • 实验6 C语言结构体、枚举应用编程
    task11//P286例8.172//对教材上的程序作了微调整,把输出学生信息单独编写成一个函数模块3//打印不及格学生信息和所有学生信息程分别调用45#include<stdio.h>6#include<string.h>7#defineN3//运行程序输入测试时,可以把这个数组改......
  • 实验6 C语言结构体、枚举应用编程
    1、实验1运行结果2、实验2源代码 1#include<stdio.h>2#include<string.h>3#defineN104#defineM8056typedefstruct{7charname[M];//书名8charauthor[M];//作者9}Book;1011intmain(){12Bookx[N]=......
  • C语言—猜数字小游戏
    #include<stdio.h>#include<time.h>#include<stdlib.h>voidmenu(){ printf("########################\n"); printf("#####1.play0.exit#####\n"); printf("########################\n");}voidgame(){......
  • 2023--2024-1 20231407陈原计算机科学概论与C语言程序设计第十二周学习总结
    这个课程属于哪里计算机基础与程序设计作业要求https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12 作业目的自学教材作业正文https://www.cnblogs.com/CCCY12345/p/17909622.html结构体:一种构造类型。内部成员由一种或多种基本类型或构造类型构......
  • C#有望成为2023年的编程语言之王
    前言TIOBE2023年12月编程语言指数头条新闻:C#有望成为2023年的编程语言之王。TIOBE是什么?访问地址:https://www.tiobe.com/tiobe-index/TIOBE是一个编程社区指数,用于衡量不同编程语言的受欢迎程度。TIOBE指数基于全球范围内熟练工程师数量、课程和第三方供应商等多个因素进行......