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是数学概念中 ...
随机推荐
- 读<分布式一致性原理>初识zookeeper
zookeeper是什么 zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如:数据发布/订阅,负载均衡,命名服务,分布式协调/通知 ,集群管理,Master选举 ...
- 查看DNS服务器
电脑右键查看本地连接 查看状态 然后看DNS
- Django models拆分
大多数Django教程都是将models放在models.py文件(模块)中, 然而随着models类的增加, 将类放在一个文件中太混乱了, 于是将models做成一个package: 这样就可以将m ...
- **请写出一段Python代码实现删除一个list里面的重复元素
通常涉及到去重操作最好使用set,但是考虑到某些时候可能遇到不允许使用set的情况,那就自己实现一下: l = [2, 4, 5, 6, 1, 3, 4, 5] def f(l, b=0, c=1): ...
- Linux运维跳槽必备的40道面试精华题
过一次年,结婚.存款.父母养老,一系列向钱看的事都在碾压我们本来还挺简单的神经,但难过没有出路,唯有找到好的方法和事业方向,才能实现一步一个脚印的逆袭. 下面是一名资深Linux运维求职数十家公司总结 ...
- XX公司的CA,与平台融合解决方法。。。。。
1,jsp 的编写要求 <script language="javascript" type="text/javascript"> var clie ...
- shell编程——日志输出的同时显屏
在执行脚本的时候我们常常需要将执行过程全部输出到日志里,以备出现报错时可以跟踪分析,开始我用的是exec: exec 1>info.log #把全部执行过程输出到info日志中 exec 2&g ...
- apktool.bat
@echo off if "%PATH_BASE%" == "" set PATH_BASE=%PATH% set PATH=%CD%;%PATH_BASE%; ...
- python3企业微信群组报警
公司提出一个需求需要做一个企业微信的一个消息推送,需要将消息发送到聊天群里详细信息如下. 如何创建应用请阅读我的上篇文章:https://www.cnblogs.com/wangyajunblog/p ...
- WWW.LoadFromCacheOrDownload
[WWW.LoadFromCacheOrDownload] static WWWLoadFromCacheOrDownload(string url, int version, uint crc = ...