在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算。此时可以使用C#语言提供的Intersect方法快速来实现两个集合之间的交集运算。Except方法调用的格式为:List1.Intersect(List2),List1和List2是相同类型的List集合数据,求出交集数据后可再使用ToList方法转换回List集合类型数据。

例如下列两个集合都为List<int>集合,list1包含的数据有: 1, 2, 3, 4, 5, 6, 7 。list2包含的数据有:4, 5, 6, 7, 8, 9, 10。针对list1和list2求交集可使用以下语句:

List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };        List<int> list2 = new List<int>() { 4, 5, 6, 7, 8, 9, 10 };

List<int> jiaojiList = list1.Intersect(list2).ToList();//使用Intersect方法求交集运算。

最后得到的结果集合jiaojiList中的数据为:4,5,6,7。

上述语句只针对普通基础的值类型,如果针对自定义类的对象的话,如果要求交集运算,则是需要相同的对象引用才算是交集中的数据,而非两个对象相同即是交集。

下面以2个例子来阐述上述加粗这部分的含义,首先我们定义要使用测试的类为TestModel类,类中只有简单的Index和Name属性,具体结构如下:

1
2
3
4
5
6
public class TestModel
 {
      public int Index { set; get; }
 
     public string Name { set; get; }
 }

(1)例子1:list1集合和list2集合中的对象元素分别来之不同的对象引用,这list1和list2交集元素个数为0。

1
2
3
4
5
6
7
8
9
10
11
List<TestModel> list1 = new List<TestModel>();
list1.Add(new TestModel() { Index = 1, Name = "TestModel1" });
list1.Add(new TestModel() { Index = 2, Name = "TestModel2" });
list1.Add(new TestModel() { Index = 3, Name = "TestModel3" });
list1.Add(new TestModel() { Index = 4, Name = "TestModel4" });
 
List<TestModel> list2 = new List<TestModel>();
list2.Add(new TestModel() { Index = 3, Name = "TestModel3" });
list2.Add(new TestModel() { Index = 4, Name = "TestModel4" });
list2.Add(new TestModel() { Index = 5, Name = "TestModel5" });
list2.Add(new TestModel() { Index = 6, Name = "TestModel6" });  

从运行的结果来看:jiaojiList为空集合,里面没有任何对象。

(2)例子2:list1集合和list2集合中的部分元素的对象引用是一致的时候,list1和list2交集的元素为这些相同对象引用的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<TestModel> list1 = new List<TestModel>();
List<TestModel> list2 = new List<TestModel>();
 
TestModel model1 = new TestModel() { Index = 1, Name = "TestModel1" };
TestModel model2 = new TestModel() { Index = 2, Name = "TestModel2" };
TestModel model3 = new TestModel() { Index = 3, Name = "TestModel3" };
TestModel model4 = new TestModel() { Index = 4, Name = "TestModel4" };
 
list1.Add(model1);
list1.Add(model2);
list1.Add(model3);
 
list2.Add(model2);
list2.Add(model3);
list2.Add(model4);
 
List<TestModel> jiaojiList = list1.Intersect(list2).ToList(); 

从运行的结果来看:jiaojiList含有2个元素,分别为model2和model3。

关于对象集合的交集的运算,例子1和例子2的差别读者详细斟酌下即可理解,是以对象的引用来判断的,而非对象的每个属性值都相同来判断,针对于自定义类对象的List集合求交集的时候需要注意这些事项。

备注:原文转载自博主个人技术站点IT技术小趣屋,原文链接C#编程中两个List集合使用Intersect方法求交集_IT技术小趣屋

list交集的更多相关文章

  1. C# 数组的交集、差集、并集

    C# 数组的交集.差集.并集 工作中经常会用这方面的知识来检查那些字段是必须输入的,那些是禁止输入. using System; using System.Collections.Generic; u ...

  2. 用uniq来处理文件重复数据--交集,差集,计数等(转)

    经常有这样的需求:两个文本文件要求取重复的行或只取不重复的,简单的情况下用sort和uniq来处理是非常方便的: 利用现存两个文件,生成一个新的文件 取出两个文件的并集(重复的行只保留一份) 取出两个 ...

  3. 取两个String数组的交集

    import org.testng.annotations.Test; import java.util.HashMap; import java.util.LinkedList; import ja ...

  4. Java对象的深拷贝和浅拷贝、集合的交集并集

    http://blog.csdn.net/lian_1988/article/details/45970927 http://www.cnblogs.com/yxnchinahlj/archive/2 ...

  5. java求字符串数组交集、并集和差集

    import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...

  6. PHP计算两个时间段是否有交集(边界重叠不算)

    优化前的版本: /** * PHP计算两个时间段是否有交集(边界重叠不算) * * @param string $beginTime1 开始时间1 * @param string $endTime1 ...

  7. 取两个DataTable的交集,删除重复数据

    /// <summary> /// 取两个DataTable的交集,删除重复数据 /// </summary> /// <param name="sourceD ...

  8. C# Linq 交集、并集、差集、去重

    using System.Linq;         List<string> ListA = new List<string>(); List<string> L ...

  9. js取两个数组的交集|差集|并集|补集|去重示例代码

    http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...

  10. 求两个集合的交集和并集C#

    我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...

随机推荐

  1. 快速了解NIO

    NIO的由来 我们都知道,在jdk1.4的时候就开始引入NIO了,它是基于Selector机制的非阻塞I/O,可以将多个异步的I/O操作集中到一个或几个线程中进行处理,目的就是为了代替阻塞I/O,提到 ...

  2. JVM -- 虚拟机中的对象

    一.HotSpot虚拟机 它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机.我们大致知道虚拟机内存的概况,也许更想了解这些虚拟机内存的数据的其他细节,誓如它们是如 ...

  3. 系统集成Facebook授权发布帖子以及获取帖子评论等功能

    公司的业务和海外贸易紧密连接,项目中需要对接Facebook.Google.Twitter相关API,下面详细描述一下我们对接Facebook中遇到的问题 1,注册Facebook账户,Faceboo ...

  4. php实现支付宝在线支付和扫码支付demo

    ### php实现支付宝在线支付和扫码支付demo 背景:在做一个公众号时增加了h5端,需要接入支付,非微信环境,选择了支付宝,以下简单记录下实现过程,并做了简单的封装,拿来即可使用,注意:本项目只是 ...

  5. 20191030-带返回值的回溯算法Leetcode解数独

    题目描述 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔 ...

  6. 1234: 约瑟夫问题-输出最后的编号(Java)

    WUSTOJ 1234: 约瑟夫问题-输出最后的编号 参考资料 约瑟夫问题--百度百科 Description n个人围成一圈,依次从1至n编号.从编号为1的人开始1至k报数,凡报数为k的人退出圈子, ...

  7. Python复习笔记02

    语句表达式: 在Python中支持遍历循环的对象:可迭代器对象,支持迭代协议的对象 比如列表list没有迭代功能只是可迭代对象 迭代:迭代协议 --> 例:f.__next__() 属于f的迭代 ...

  8. NIPS 2018 | 程序翻译新突破:UC伯克利提出树到树的程序翻译神经网络

    NIPS 2018 | 程序翻译新突破:UC伯克利提出树到树的程序翻译神经网络 机器之心 ​ 已认证的官方帐号 49 人赞同了该文章 选自arXiv,作者:Xinyun Chen.Chang Liu. ...

  9. Unity性能优化-遮挡剔除

    1. Occlusion Culling-遮挡剔除的含义:没有在Camear视野范围内的游戏物体不进行渲染Render(默认情况下,Unity是会渲染所有GameObject,无论Camear是否看得 ...

  10. CAN总线上的消息单帧某个信号的值计算(C#)

      public static ulong GetMotorolaSignalValue(byte[] data, int startBit, int bitLength) { ; , j =; i ...