Linq转换操作之ToArray,ToList,ToDictionary源码分析
Linq转换操作之ToArray,ToList,ToDictionary源码分析
一:linq中的转换运算符
1. ToArray
我们经常用在linq查询上吧。 linq只能运用在IEnumerable这个集合类型上面。
源码分析: 我们发现如果该类型可以转化为ICollection,我们最后执行CopyTo方法
如果不能转换为ICollection,那么就执行foreach。
2. ToList
这个我们发现比ToArray更简单,如果说可以转换为ICollection,那么它直接使用了List的构造函数,在List的构造函数中,我们看到非常
简单。如果不能转为就执行foreach添加。
3. ToDictionary
var list = new List<int>() { 10, 20, 30 };
var query2 = from n in list
select new { num = n };
var myarr = query2.ToDictionary(i => i.num);
从编译器中我们应该可以看到,toDictionary之后,我们的key是一个int,value为一个匿名类型 'a
[10, 'a],[20,'a],[30,'a]
最终可以看到ToDictionary最后调用的是
foreach (TSource current in source)
{
dictionary.Add(keySelector(current), elementSelector(current));
}
Linq转换操作之ToArray,ToList,ToDictionary源码分析的更多相关文章
- Linq集合操作之Intersect,Except,Union源码分析
Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...
- Linq限定操作之All,Any,Contains源码分析
Linq限定操作之All,Any,Contains源码分析 linq的限定操作 常见的限定操作: All,Any,Contains 一:All 1. 解释: 确定序列中的所有元素是否满足条件. 从字面 ...
- Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析 二:linq的分区操作 常用的分区操作:Take,TakeWhile,Skip,SkipWhile 三:Take ...
- 集合操作出现的ConcurrentModificationException(源码分析)
摘要: 为了保证线程安全,在迭代器迭代的过程中,线程是不能对集合本身进行操作(修改,删除,增加)的,否则会抛出ConcurrentModificationException的异常. 示例: publi ...
- HashMap在JDK1.8中并发操作,代码测试以及源码分析
HashMap在JDK1.8中并发操作不会出现死循环,只会出现缺数据.测试如下: package JDKSource; import java.util.HashMap; import java.ut ...
- 【集合框架】JDK1.8源码分析之LinkedList(七)
一.前言 在分析了ArrayList了之后,紧接着必须要分析它的同胞兄弟:LinkedList,LinkedList与ArrayList在底层的实现上有所不同,其实,只要我们有数据结构的基础,在分析源 ...
- 【JUC】JDK1.8源码分析之ConcurrentSkipListSet(八)
一.前言 分析完了CopyOnWriteArraySet后,继续分析Set集合在JUC框架下的另一个集合,ConcurrentSkipListSet,ConcurrentSkipListSet一个基于 ...
- 死磕 java集合之ArrayDeque源码分析
问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...
- 【JDK】JDK源码分析-HashMap(1)
概述 HashMap 是 Java 开发中最常用的容器类之一,也是面试的常客.它其实就是前文「数据结构与算法笔记(二)」中「散列表」的实现,处理散列冲突用的是“链表法”,并且在 JDK 1.8 做了优 ...
随机推荐
- Tkinter Menu(菜单)
Tkinter Menu: 这个小工具的目标是,让我们来创建我们的应用程序,可以通过使用各种菜单.核心功能,提供的方式来创建三个菜单类型:弹出式,顶层,和下拉 这个小工具的目标是,让我们来创建 ...
- [z]单次遍历带权随机选取
http://www.gocalf.com/blog/weighted-random-selection.html 没事可以看看,这个博客里面很多文章不错
- MVC地址输出变为小写
其实个人不知道有什么区别,看到大多数都是小写,还是小写吧 去nuget安装一个第三方,然后对路由简单修改一下 插件名称:LowercaseRoutesMVC 方法名:MapRouteLowercase ...
- pid文件的作用
pid文件的作用 一.pid文件的作用 1.pid文件的内容用cat命令查看,可以看到内容只有一行,记录了该进程的ID 2.pid文件的作用防止启动多个进程副本 3.pid文件的原理进程运行后会给.p ...
- ubuntu系统中出现mysql数据库无法启动报错2002该怎么处理,具体报错信息如正文所示
python@ubuntu:~$ mysql -uroot -pmysqlmysql: [Warning] Using a password on the command line interface ...
- css常用属性总结之 id和class的区别,使用类还是ID?
前面两篇文章我们分别谈到了class和id的相关知识和如何使用,但是在实际项目中,我们该如何抉择,class还是id? 先回顾下两者的区别吧! 1.id具有唯一性,class具有普遍性,所以一个页面同 ...
- Unity iOS 项目的一种性能评测方法
[Unity iOS 项目的一种性能评测方法]
- 104. Maximum Depth of Binary Tree (Tree; DFS)
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- java程序员应该熟悉的20个有用的库(转)
优秀且经验丰富的Java开发人员的一个特点是API的广泛知识,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Blo ...
- 为单个项目添加多个远程仓库(Git操作)
书写代码时,有时候需要维护多个仓库,这时候就面对了这个需求,解决方法如下: $ git remote add github ****** $ git remote add mayun ****** 书 ...