Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析

一:Tolookup

1. 从方法的注解上可以看到,ToLookup也是一个k,v的形式,那么问题来了,它和Dcitionary有什么区别???

可以看到ToDictionray中的源码是这样的:

foreach (TSource current in source)
{
dictionary.Add(keySelector(current), elementSelector(current));
}

大家有没有看到,这个源码有什么不合实际的地方。。。

如果key重复了,那么这个ToDictionary却对是要报错的。。。。

现在我的要求来了,如果说key重复了,我希望value中的值类型起来。这个就是我们今天要讲的ToLookup要解决的问题。

二:lookup的源码分析

Lookup<TKey, TElement> lookup = new Lookup<TKey, TElement>(comparer);
foreach (TSource current in source)
{
lookup.GetGrouping(keySelector(current), true).Add(elementSelector(current));
}

大家课后可以仔细看一看。

三:OfType转换运算符 (筛选制定类型)

1. 解释: 根据指定类型筛选 System.Collections.IEnumerable 的元素。

     var list = new List<object>() { 20, "3D", 24 };var array = list.OfType<int>(); //结果是 int 集合

通过demo,我们可以看到OfType就是筛选指定的类型。

很可惜,ILSpy看不到。

四:Cast运算符

1. 解释: 将 System.Collections.IEnumerable 的元素强制转换为指定的类型。

这也告诉我们,ILSpy也不是所有的代码都能看得到。。。

Cast的扩展方法

1. 将 IEnumerable 的元素强制转换为指定的类型。 这句话有强大的误导性

System.Collections.ArrayList fruits = new System.Collections.ArrayList();
fruits.Add("mango");
fruits.Add("apple");
fruits.Add("lemon");

IEnumerable<string> query =
fruits.Cast<string>().OrderBy(fruit => fruit).Select(fruit => fruit);

为什么这个可以cast成功的原因是什么???

string => object => string[cast]

这个过程叫做拆装箱。。。

static void Main(string[] args)
{
var list = new int[] { 10, 20, 30 };

var query = list.Cast<object>().ToList(); //装箱

var myquery = query.Cast<int>().ToList(); //拆箱

var myquery2 = list.Cast<long>().ToList(); //隐式转换 [不可以]
}

可以看得到,Cast并不是我们看到如解释一样那么容易理解。

五:asEnumerable

如果当前的类型没有继承IEumverable这个接口,那么我们可以强制将这个类型转换为继承子

IEnumverable接口的类。

var table = new DataTable();

table.AsEnumerable().Select(i => i.Field<string>(""));

转载于:https://www.cnblogs.com/dragon-L/p/6444657.html

Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析相关推荐

  1. 系统性详解Redis操作Hash类型数据(带源码分析及测试结果)

    1 缘起 系统讲解Redis的Hash类型CURD, 帮助学习者系统且准确学习Hash数据操作, 逐步养成测试的好习惯, 本文较长,Hash的操作比较多,请耐心看, 既可以集中时间看,亦可以碎片时间学 ...

  2. 【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )

    文章目录 一.目前的 API 现状 二.安装应用源码分析 1.安装按钮执行的操作 2.返回到 HomeActivity 执行的操作 一.目前的 API 现状 下图是 VirtualApp 官方给出的集 ...

  3. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  4. SpringMVC关于json、xml自动转换的原理研究[附带源码分析 --转

    SpringMVC关于json.xml自动转换的原理研究[附带源码分析] 原文地址:http://www.cnblogs.com/fangjian0423/p/springMVC-xml-json-c ...

  5. C语言3D矢量操作有关的功能(附完整源码)

    3D矢量操作有关的功能 3D矢量数据类型定义 geometry_datatypes.h 3D矢量操作有关的功能以下几个接口 3D矢量操作有关的功能的完整源码(定义,实现,main函数测试) 3D矢量数 ...

  6. OpenCascade源码分析之BRepMesh_IncrementalMesh(网格离散化操作)

    OpenCascade源码分析之BRepMesh_IncrementalMesh(网格离散化操作) 一.引言 在使用opencascade读取连续曲面模型的时候,一般来说我们都会调用BRepMesh_ ...

  7. mybatis高级操作及源码分析(一)

    Mybatis中使用注解 or xml 文件? 注解使用姿势 下面以Select注解为例. @Select 的本质还是 xml 文件的形式,有两种方式@Select注解和@SelectProvider ...

  8. Raft源码分析(二) - Role转换

    时光粒子源码 分布式一致性/分布式存储等开源技术探讨, GitHub:raft | 时光粒子源码 Raft源码分析 - 关于 Raft源码分析(一) - State Raft源码分析(二) - Rol ...

  9. 时间转秒函数c语言,c语言函数mktime()如何将时间转换成经过的秒数实例源码

    c语言函数mktime()如何将时间转换成经过的秒数实例源码. 需要引入的头文件:#include 定义函数:time_t mktime(strcut tm * timeptr); 函数mktime( ...

  10. tfs_client php,TFS 源码分析 写文件操作 Client端

    整个写文件的总体流程这里有介绍 主要分析了写文件时,NameServer端的源码分析 这篇文章介绍写文件时,Client端的源码分析 本文描述的内容涉及TFS写入流程图中的step1, step2, ...

最新文章

  1. C# 简单软件有效期注册的实现【原】
  2. opencv计算亮度
  3. 『第12天』从ipc$ 连接失败讲起
  4. plot与legend画图与图例
  5. 一文带你 API 网关从入门到放弃
  6. kafka streams_Kafka REST Proxy MapR Streams入门
  7. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式
  8. 地址总线是单向还是双向_如何区分晶闸管的单双向问题?
  9. java演练 数组的逆序文字玩法 你是猪才怪
  10. EntityFramework使用及优化
  11. Java Web学习网站
  12. 解决MATLAB的xlsread函数读取表格失败
  13. multipartfile获取数据_关于使用Springmvc的MultipartHttpServletRequest来获得表单上传文件的问题,万分感谢~...
  14. 转:移动互联:没有新故事没有新大佬
  15. 【转载】《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline
  16. conda安装packages时报错File “C:\ProgramData\anaconda3\lib\site-packages\conda\core\subdir_data.py“
  17. spark+smack+openfire实现请求响应简单流程
  18. Java网页数据抓取实例
  19. 【概率统计】用正态分布和泊松分布近似表示二项分布
  20. 硬盘柱面损坏怎么办_【已解决】郁闷了。。。笔记本硬盘0柱面坏道。。。分享下教训、经验...

热门文章

  1. 关于利用border-radius变形后,margin的参照对象
  2. lock.lock()使用,与synchronized对比
  3. 【渝粤教育】国家开放大学2018年春季 3923T汽车维修企业管理 参考试题
  4. [渝粤教育] 中国地质大学 职业健康管理体系 复习题
  5. 等效低通信号=带通信号的复包络
  6. 【5分钟 Paper】Deep Recurrent Q-Learning for Partially Observable MDPs
  7. 系统类配置(二)【深度学习装机详细教程-ubuntu16.04下安装cuda9.0+nvidia-384+cudnn7.1.4+tensorflow1.9。】
  8. react-native 开发在Android模拟器上运行
  9. 腾讯云安全:移动 APP 安全行业报告
  10. 安装quickLook插件以及解决如何不能读取offic问题