LINQ的技术演进

2023-11-09

以一个简单的例子来说明:

var developersUsingCSharp =

   from d in developers
   where d.Language == "C#"
   select d.Name;

1)提供对IEnumerable<T>的Extension Method使得它可以将where, select应用到任意实现了IEnumerable<T>接口的对象上;

      public static IEnumerable<T> Where<T>(
                this IEnumerable<T> source,
                Func<T, bool> predicate);

     public static IEnumerable<TResult> Select<TSource, TResult>(
               this IEnumerable<TSource> source,
               Func<TSource, TResult> selector);

     由此得到演进的No.1形式:

      var filteredDevelopers = developers.Where(delegate (Developer d) {
                return (d.Language == "C#");
      });

2)采用lambda expression实现anonymous delegate;

     由此得到演进的No.2形式:

     IEnumerable<string> developersUsingCSharp =
           developers
           .Where(d => d.Language == "C#")
           .Select(d => d.Name);

3)C# Compiler将Linq Query Expression翻译成lambda expression的形式。由此得到了对用户最友好的方式。

     在有些特殊情况下依然需要使用扩展方法来实现。

Note-1: Group and Into Clause(可以使用LINQPad进行练习)

class Developer
	{
	  public string Name {get;  set;}
	  public string Language {get;set;}
	  public int Age {get;set;}
	}
void Main()
{	
	Developer[] developers = new Developer[] {
	new Developer { Name = "Paolo", Language = "C#", Age = 32 },
	new Developer { Name = "Marco", Language = "C#", Age = 37},
	new Developer { Name = "Frank", Language = "VB.NET", Age = 48 },
	};
	
	var developersGroupedByLanguage =
	   from d in developers
	   //group d by d.Language;
	   group d by new { d.Language, AgeCluster = (d.Age / 10) * 10 };
	foreach (var group in developersGroupedByLanguage) {
		Console.WriteLine("Language: {0}", group.Key);
		foreach (var item in group) {
			Console.WriteLine("\t{0}-{1}", item.Name,item.Age);
		}
	}
	
	var developersGroupedByLanguage2 =
		from d in developers
		group d by d.Language into developersGrouped
		select new {
			Language = developersGrouped.Key,
			DevelopersCount = developersGrouped.Count()
		};
		foreach (var group in developersGroupedByLanguage2) {
			Console.WriteLine ("Language {0} contains {1} developers",
			group.Language, group.DevelopersCount);
		}
}

输出结果如下:

Language: { Language = C#, AgeCluster = 30 }
  Paolo-32
  Marco-37
Language: { Language = VB.NET, AgeCluster = 40 }
  Frank-48
Language C# contains 2 developers
Language VB.NET contains 1 developers
 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ的技术演进 的相关文章

随机推荐

  • 怎么样理解同步清零和异步清零?

    DA专业论坛 通用设计 求助 大家是怎么样理解 同步清零和 异步清零的 查看完整版本 求助 大家是怎么样理解同步清零和异步清零的 mxflying 2005 4 20 03 45 求助 大家是怎么样理解 同步清零和 异步清零的 本人对 同步
  • ROS-kinetic中Gazebo中的机械臂仿真报错解决

    1 警告 其实是错误 但也要解决 WARN 1682069601 434351 0 000000 Controller Spawner couldn t find the expected controller manager ROS in
  • 有哪些因素影响服务器的访问速度

    在网络环境下 根据服务器提供的服务类型不同 分为文件服务器 数据库服务器 应用程序服务器 WEB服务器等 一些对服务器的了解不够深入的朋友 会认为服务器的配置越高 服务器的访问速度就会越快 这句话有一定的道理 但是服务器的配置高低只是影响服
  • 计算机视觉项目实战-图像特征检测harris、sift、特征匹配

    欢迎来到本博客 本次博客内容将继续讲解关于OpenCV的相关知识 作者简介 目前计算机研究生在读 主要研究方向是人工智能和群智能算法方向 目前熟悉python网页爬虫 机器学习 计算机视觉 OpenCV 群智能算法 然后正在学习深度学习的相
  • android中下拉菜单的制作(详解)

    在我们的android中下拉菜单的制作有两种的方法 1 一种的方式就是通过我们的布局文件的方法制作 2 第二种方式就是通过我们的java代码的方式制作 第一种方式
  • deepin 20.2版本亮度调节问题暂时解决方案

    可在设置 gt 键盘和语言 gt 快捷键 中设置自己需要的快捷键 建议alt 1和alt 2这两个 与现有快捷键没有冲突 使用原来的快捷键会提示冲突 如果覆盖了设置可能会使原来的快捷键失效 分别添加下面的命令 降低亮度 echo your
  • Anaconda 换源与更新

    参考 Windows下Anaconda安装 换源与更新 里面很详细介绍了 conda 的更新 与 Anaconda 的更新
  • Node.js入门笔记(一)——环境问题和版本号问题

    Node js入门笔记 一 1 node js的版本管理工具 nvm 2 npm全局安装和局部安装 3 开发环境安装与生产环境安装 4 其他常用的npm语法 5 版本号里面的讲究 6 npm上传包 其实就是寒假比较无聊搭了这个自己的博客网站
  • Visual Studio+VAssistX自动添加注释

    1 增加函数头注释 右击函数名 然后依次点击 Refacto gt Document Method 这个时候函数头注释就会蹦出来 不过这个注释的格式是默认的 想修改注释格式 可以通过以下方法 点击 VAssistX gt Visual VA
  • IE下载文件时,中文文件名乱码问题

    经排查 Content Disposition中的filename进行了两次URL转码 以汉字漫为例 第一次转码 漫变为 E6 BC AB 第二次转码 E6 BC AB变为 25E6 25BC 25AB 第二次转码时 因为 是特殊字符 所以
  • word2vector学习笔记(一)

    word2vector学习笔记 一 最近研究了一下google的开源项目word2vector http code google com p word2vec 其实这玩意算是神经网络在文本挖掘的一项成功应用 本文是看了论文 Distribu
  • Spring中如何在一个Bean中注入一个内部Bean呢?

    转自 Spring中如何在一个Bean中注入一个内部Bean呢 在日常开发中 有些实体类的定义 一个类中包含了另一个类 那么在Spring Bean中 同样也有此种操作 下文将讲述使用xml配置文件的方式注入内部bean的方法 实现思路 使
  • 经典面试题 为什么要用 Docker

    经典面试题 为什么要用 Docker 解决面试题 斩获心仪的 Offer 文章目录 经典面试题 为什么要用 Docker 一 Docker是什么 二 Docker 的优势 1 更高效的利用系统资源 2 更快速的启动时间 3 一致的运行环境
  • T检验python实现

    from scipy import stats import numpy as np 方差齐性检验 方差反映了一组数据与其平均值的偏离程度 方差齐性检验用以检验两组或多组数据与其均值偏离程度是否存在差异 也是很多检验和算法的先决条件 np
  • 深度学习之基于Xception实现四种动物识别

    本次实验类似于猫狗大战 只不过将两种动物识别变为了四种动物识别 本文的重点是卷积神经网络Xception的实践 在之前的学习中 我们已经实验过其他几种比较常用的网络模型 但是Xception网络并未实践过 在弄本科毕设的时候 一个好朋友的毕
  • bukku ctf(刷题2)

    bugku ctf 抄错的字符 简单取证1 这是一张单纯的图片 计算器 GET POST 矛盾 alert 你必须让他停下 signin Easy Re 游戏过关 Easy vb 树木的小秘密 Timer 阿里CTF 抄错的字符 Crypt
  • Handler进阶之sendMessage原理探索

    Handler进阶之sendMessage 本文主要进一步的探索Handler 主要介绍下Handler是如何发送消息的 用过Handler的想必对以下几个方法都不会陌生 sendMessage Message msg 立刻发送消息 sen
  • Jdk下载和安装

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 下载JDK 二 安装JDK 三 配置环境 四 检验安装 前言 学习java第一步 写java文件都需要配置java环境 提示 以下是本篇文章正文内容 下面
  • 嵌入式-术语解释(不定时更新)

    饱和操作 饱和运算 饱和运算 就是当运算结果大于一个上限或小于一个下限时 结果就等于上限或是下限 饱和加法 a b c 当计算结果大于c可表示的最大值或者小于c可表示的最小值时 计算结果取值为这个最大值或最小值 非饱和加法 a b c 如果
  • LINQ的技术演进

    以一个简单的例子来说明 var developersUsingCSharp from d in developers where d Language C select d Name 1 提供对IEnumerable