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>() { , "3D",  };

     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>(""));

Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析的更多相关文章

  1. Linq分组操作之GroupBy,GroupJoin扩展方法源码分析

    Linq分组操作之GroupBy,GroupJoin扩展方法源码分析 一. GroupBy 解释: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值. 查询表达式: var ...

  2. Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析

    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析 一:Linq的聚合运算 1. 常见的聚合运算:Aggregate,Count, Sum, Distinct,Max, ...

  3. Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析

    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析 Linq的四种生成运算 DefautIfEmpty,Empty,Range,Repeat 也就是给我们初始化 ...

  4. Linq基础操作之Select,Where,OrderBy,ThenBy源码分析

    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析 二:Select 它是延迟执行.yield有得一拼,因为他们都是生成了一个枚举类. if (source is TSo ...

  5. Linq特取操作之ElementAt,Single,Last,First源码分析

    Linq特取操作之ElementAt,Single,Last,First源码分析 一:linq的特取操作 First/FirstOrDefault, Last/LastOrDefault, Eleme ...

  6. Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析

    Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析 一: AsParallel [并行化查询] 这个函数的功效就是将计算结果多线程化.[并行计算] =>[多核 ...

  7. Linq转换操作之ToArray,ToList,ToDictionary源码分析

    Linq转换操作之ToArray,ToList,ToDictionary源码分析 一:linq中的转换运算符 1. ToArray 我们经常用在linq查询上吧. linq只能运用在IEnumerab ...

  8. Linq集合操作之Intersect,Except,Union源码分析

    Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...

  9. Linq限定操作之All,Any,Contains源码分析

    Linq限定操作之All,Any,Contains源码分析 linq的限定操作 常见的限定操作: All,Any,Contains 一:All 1. 解释: 确定序列中的所有元素是否满足条件. 从字面 ...

随机推荐

  1. LeetCode题解 #8 String to Integer (atoi)

    又是一道恶心的简单题. 一开始没想到这么多情况的,幸好LeetCode是个很人性化的oj,能让你知道你在哪个case上错了,否则一辈子都过不了. 考虑不周到只能一个个补了. 列举一下恶心的case / ...

  2. vagrant+docker搭建consul集群开发环境

    HashiCorp 公司推出的Consul是一款分布式高可用服务治理与服务配置的工具.关于其配置与使用可以参考这篇文章 consul 简介与配置说明. 一般,我们会在多台主机上安装并启动 consul ...

  3. 搭建一个Web API项目(DDD)

    传送阵:写在最后 一.创建一个能跑的起来的Web API项目 1.建一个空的 ASP.NET Web应用 (为什么不直接添加一个Web API项目呢,那样会有些多余的内容(如js.css.Areas等 ...

  4. IDEA2017 破解方式

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  5. struts2 action重定向action中文乱码处理

    比如:Action方法productCategorySave()变量message,传递给Action方法productCategoryAdd(),当变量message为中文变量时,要进行编码设置,不 ...

  6. Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践

    1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...

  7. Unity iOS 项目的一种性能评测方法

    [Unity iOS 项目的一种性能评测方法]

  8. orcle clob字段查询

    select utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(column,2000,1)) from t

  9. jedis的publish/subscribe[转]含有redis源码解析

    首先使用redis客户端来进行publish与subscribe的功能是否能够正常运行. 打开redis服务器 [root@localhost ~]# redis-server /opt/redis- ...

  10. LIS和LCS LCIS

    首先介绍一下LIS和LCS的DP解法O(N^2) LCS:两个有序序列a和b,求他们公共子序列的最大长度 我们定义一个数组DP[i][j],表示的是a的前i项和b的前j项的最大公共子序列的长度,那么由 ...