Linq特取操作之ElementAt,Single,Last,First源码分析 一:linq的特取操作 First/FirstOrDefault, Last/LastOrDefault, ElementAt/ElementAtOrDefault, Single/SingleOrDefault 二:First/FirstOrDefault 介绍 解释: 用于返回序列中的第一个值 异常: 如果当前集合没有值的话,如果你取第一个值,会抛出throw Error.NoElements();异常. pu…
Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析 一:Linq的聚合运算 1. 常见的聚合运算:Aggregate,Count, Sum, Distinct,Max,Min 这几个聚合运算,我们在sql中看的还是比较多的. 二:Count 1. 这个我们用到的非常多,Count() / LongCount(). 2. LongCount每次都是foreach循环,所以这个性能问题就出来了. 三:Sum var nums = new int[] { 10, 20,…
Linq分组操作之GroupBy,GroupJoin扩展方法源码分析 一. GroupBy 解释: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值. 查询表达式: var list = new List<object>() { 20, 30, 24 };查询表达式: var query = from n in list group n by n into grp select new { MyKey = grp.Key, MyValue = grp.Count()…
Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析 Linq的四种生成运算 DefautIfEmpty,Empty,Range,Repeat 也就是给我们初始化用的. 一:DefaultIfEmpty [返回枚举类的类型] 1. 看注释: 返回指定序列的元素:如果序列为空,则返回单一实例集合中的类型参数的默认值. 2. 查看实例代码 static void Main(string[] args) { var list = new List<int>();…
Linq基础操作之Select,Where,OrderBy,ThenBy源码分析 二:Select 它是延迟执行.yield有得一拼,因为他们都是生成了一个枚举类. if (source is TSource[]) { return new Enumerable.WhereSelectArrayIterator<TSource, TResult>((TSource[])source, null, selector); } 可以清楚的看到WhereSelectArrayIterator<T…
Linq转换操作之OfType,Cast,AsEnumerable,ToLookup源码分析 一:Tolookup 1. 从方法的注解上可以看到,ToLookup也是一个k,v的形式,那么问题来了,它和Dcitionary有什么区别??? 可以看到ToDictionray中的源码是这样的: foreach (TSource current in source) { dictionary.Add(keySelector(current), elementSelector(current)); }…
Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法基础: O(MN) 有算法基础: O(M+N) 这个复杂度就不是一个级别上了. 1. Intersect [交集] static void Main(string[] args) { var num1 = new int[] { 10, 40, 80, 100 }; var num2 = new i…
Linq限定操作之All,Any,Contains源码分析 linq的限定操作 常见的限定操作: All,Any,Contains 一:All 1. 解释: 确定序列中的所有元素是否满足条件. 从字面意思上面,我们是否可以看到,避免我们写foreach语句. static void Main(string[] args) { var nums = new int[] { 10, 20, 30, 40 }; var query = nums.All(i => i == 10); } 2. 看源码:…
Linq转换操作之ToArray,ToList,ToDictionary源码分析 一:linq中的转换运算符 1. ToArray 我们经常用在linq查询上吧. linq只能运用在IEnumerable这个集合类型上面. 源码分析: 我们发现如果该类型可以转化为ICollection,我们最后执行CopyTo方法 如果不能转换为ICollection,那么就执行foreach. 2. ToList 这个我们发现比ToArray更简单,如果说可以转换为ICollection,那么它直接使用了Li…
Linq扩展最后遗留之SelectMany,Zip,SequenceEqual源码分析 一: AsParallel [并行化查询] 这个函数的功效就是将计算结果多线程化.[并行计算] =>[多核] 二:AsQueryable [将lambda表达式作为数据结构存储起来,Expresstion 表达式树] 三:Join 多表关联操作,我们可以用”查询关键字“解决. 为了更加的脱俗易懂,我们建议用人性化的”查询关键字“来解决这个复杂的Join,lambda. 四:SelectMany 1.解释: 将…