Linq集合操作之Intersect,Except,Union源码分析
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 int[] { 20, 30, 40, 70 };
//求交集
var query = num1.Intersect(num2);
HashSet<int> hashset = new HashSet<int>(num1); // O(N) N=num1.Length
foreach (var num in num2) //O(M) M=num2.Length
{
if (hashset.Contains(num)) // O(1)的复杂度。
{
//Add操作
}
}
//=> O(M+N)
}
<1> newobj instance void class System.Linq.Set`1<!TSource>::.ctor(class [mscorlib]System.Collections.Generic.IEqualityComparer`1<!0>)
<2> callvirt instance bool class System.Linq.Set`1<!TSource>::Add(!0)
先将数据塞入到Set中,然后foreach随便一个集合,判断将当前值和foreach的迭代变量进行比较。
2. Except 【差集】
集合的差集运算,同样你也可以将复杂度从O(MN) => O(M+N)
3. Union 【并集】
static void Main(string[] args)
{
var num1 = new int[] { 10, 40, 80, 100 };
var num2 = new int[] { 20, 30, 40, 70 };
//Num1-Num2 = {10,80,100}
//var query = num1.Except(num2);
var query = num1.Union(num2);
}
linq有了这些扩展方法之后,就避免了我们写过多的foreach,for循环。这样让我们更加的专注于业务逻辑。
从源代码可以看到,两个串行的foreach,也养复杂度也做到了 “加法运算”。
Linq集合操作之Intersect,Except,Union源码分析的更多相关文章
- Linq转换操作之ToArray,ToList,ToDictionary源码分析
Linq转换操作之ToArray,ToList,ToDictionary源码分析 一:linq中的转换运算符 1. ToArray 我们经常用在linq查询上吧. linq只能运用在IEnumerab ...
- Linq限定操作之All,Any,Contains源码分析
Linq限定操作之All,Any,Contains源码分析 linq的限定操作 常见的限定操作: All,Any,Contains 一:All 1. 解释: 确定序列中的所有元素是否满足条件. 从字面 ...
- 集合操作出现的ConcurrentModificationException(源码分析)
摘要: 为了保证线程安全,在迭代器迭代的过程中,线程是不能对集合本身进行操作(修改,删除,增加)的,否则会抛出ConcurrentModificationException的异常. 示例: publi ...
- Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析 二:linq的分区操作 常用的分区操作:Take,TakeWhile,Skip,SkipWhile 三:Take ...
- Java 集合系列(四)—— ListIterator 源码分析
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比 Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素. Iterator 包含四个方法 ...
- 7.Java集合-Arrays类实现原理及源码分析
Java集合---Arrays类源码解析 转自:http://www.cnblogs.com/ITtangtang/p/3948765.html 一.Arrays.sort()数组排序 Java A ...
- HashMap在JDK1.8中并发操作,代码测试以及源码分析
HashMap在JDK1.8中并发操作不会出现死循环,只会出现缺数据.测试如下: package JDKSource; import java.util.HashMap; import java.ut ...
- Java源码解析——集合框架(五)——HashMap源码分析
HashMap源码分析 HashMap的底层实现是面试中问到最多的,其原理也更加复杂,涉及的知识也越多,在项目中的使用也最多.因此清晰分析出其底层源码对于深刻理解其实现有重要的意义,jdk1.8之后其 ...
- java集合框架02——Collection架构与源码分析
Collection是一个接口,它主要的两个分支是List和Set.如下图所示: List和Set都是接口,它们继承与Collection.List是有序的队列,可以用重复的元素:而Set是数学概念中 ...
随机推荐
- CentOS7.6安装JDK(Openjdk) - mvn package报错汇总
错误一: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK ...
- linux weather
- MySQL查看用户权限的两种方法
http://yanue.net/post-96.html MySQL查看用户权限命令的两方法: 一. 使用MySQL grants MySQL grant详细用法见:http://yanue.net ...
- C# 强制删除文件,解除占用的几点思考
有一个古老的传说: 占用的文件是可以被强制删除的... 如果被别的应用程序打开着,你就要先找到那个打开的程序,结束掉才行.或者关闭关闭相关进程,延迟的方法. 一般来说被占用就意味着有其它进行或者线程对 ...
- leetcode341
数据结构设计类题目,参考网上的代码: /** * // This is the interface that allows for creating nested lists. * // You sh ...
- spring-boot-actuator健康监控
#健康监控 management.security.enabled=false health.mail.enabled =false http://localhost:54001/autoconfig ...
- 详解Vue2.0生命周期
网上已经有很多关于vue生命周期的文章,我的这篇文章的由来,其实是我对官网上描述的一句话的思考与理解:“el被新创建的vm.$el替换”,所以文章更多的内容可能是在对vue生命周期中“created ...
- Ubuntu 查看磁盘空间大小命令<转>
df -h Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesyst ...
- 谈谈跨平台的app开发 坚定的选择了flutter
目前市场上,(市场也许用的不对),比较常见的技术有xamrin.RN.Flutter,确切的说flutter是后起之秀,笔者也是最近才开始学习,xamrin是微软系的技术,笔者也很早就开始学习了,RN ...
- IPHONE 64位和32位
参考段一:iPhone 5没有64位的,只有32位架构,苹果是从iPhone 5s开始对全线移动产品使用64位架构.iPhone 5s发布之后的所有产品都是64位的使用LUAJIT或LUAC都可以对L ...