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源码分析的更多相关文章

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

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

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

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

  3. 集合操作出现的ConcurrentModificationException(源码分析)

    摘要: 为了保证线程安全,在迭代器迭代的过程中,线程是不能对集合本身进行操作(修改,删除,增加)的,否则会抛出ConcurrentModificationException的异常. 示例: publi ...

  4. Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析

    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析 二:linq的分区操作 常用的分区操作:Take,TakeWhile,Skip,SkipWhile 三:Take ...

  5. Java 集合系列(四)—— ListIterator 源码分析

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比   Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素.  Iterator 包含四个方法 ...

  6. 7.Java集合-Arrays类实现原理及源码分析

    Java集合---Arrays类源码解析  转自:http://www.cnblogs.com/ITtangtang/p/3948765.html 一.Arrays.sort()数组排序 Java A ...

  7. HashMap在JDK1.8中并发操作,代码测试以及源码分析

    HashMap在JDK1.8中并发操作不会出现死循环,只会出现缺数据.测试如下: package JDKSource; import java.util.HashMap; import java.ut ...

  8. Java源码解析——集合框架(五)——HashMap源码分析

    HashMap源码分析 HashMap的底层实现是面试中问到最多的,其原理也更加复杂,涉及的知识也越多,在项目中的使用也最多.因此清晰分析出其底层源码对于深刻理解其实现有重要的意义,jdk1.8之后其 ...

  9. java集合框架02——Collection架构与源码分析

    Collection是一个接口,它主要的两个分支是List和Set.如下图所示: List和Set都是接口,它们继承与Collection.List是有序的队列,可以用重复的元素:而Set是数学概念中 ...

随机推荐

  1. CentOS7.6安装JDK(Openjdk) - mvn package报错汇总

    错误一: No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK ...

  2. linux weather

  3. MySQL查看用户权限的两种方法

    http://yanue.net/post-96.html MySQL查看用户权限命令的两方法: 一. 使用MySQL grants MySQL grant详细用法见:http://yanue.net ...

  4. C# 强制删除文件,解除占用的几点思考

    有一个古老的传说: 占用的文件是可以被强制删除的... 如果被别的应用程序打开着,你就要先找到那个打开的程序,结束掉才行.或者关闭关闭相关进程,延迟的方法. 一般来说被占用就意味着有其它进行或者线程对 ...

  5. leetcode341

    数据结构设计类题目,参考网上的代码: /** * // This is the interface that allows for creating nested lists. * // You sh ...

  6. spring-boot-actuator健康监控

    #健康监控 management.security.enabled=false health.mail.enabled =false http://localhost:54001/autoconfig ...

  7. 详解Vue2.0生命周期

    网上已经有很多关于vue生命周期的文章,我的这篇文章的由来,其实是我对官网上描述的一句话的思考与理解:“el被新创建的vm.$el替换”,所以文章更多的内容可能是在对vue生命周期中“created ...

  8. Ubuntu 查看磁盘空间大小命令<转>

    df -h Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesyst ...

  9. 谈谈跨平台的app开发 坚定的选择了flutter

    目前市场上,(市场也许用的不对),比较常见的技术有xamrin.RN.Flutter,确切的说flutter是后起之秀,笔者也是最近才开始学习,xamrin是微软系的技术,笔者也很早就开始学习了,RN ...

  10. IPHONE 64位和32位

    参考段一:iPhone 5没有64位的,只有32位架构,苹果是从iPhone 5s开始对全线移动产品使用64位架构.iPhone 5s发布之后的所有产品都是64位的使用LUAJIT或LUAC都可以对L ...