c#得出两个列表的交集
c#提供了Intersect来得到两个列表的交集,它是通过使用默认的相等比较器对值进行比较生成两个序列的交集,定义为:
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);
我们使用它来比较两个列表试试:
List<double> oneList = new List<double> { , , , };
List<double> twoList = new List<double> { , };
List<double> result = oneList.Intersect(twoList).ToList();
结果是{9,3}
我们再来试试对象列表
我们先定义一个模型
public class TarGetValueList
{
public double TargetValue { get; set; } }
然后求交集
List<TarGetValueList> ListOne = new List<TarGetValueList>();
List<TarGetValueList> ListTwo= new List<TarGetValueList>();
//第一个列表增加的对象
TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 };
TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 };
TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 };
TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 };
//第二个列表增加的对象
TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };//第一个列表增加对象
ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7
//第二个列表增加对象
ListTwo.Add(Five); ListTwo.Add(Three); //5 3
List<TarGetValueList> resultList = ListTwo.Intersect(ListOne).ToList();
第一个列表是{9,6,5,7},第二个列表是{5,3},结果交集是{5},结果在预想之内,至今为止,一切都很顺利。我们似乎已经掌握了用c#来求两个列表的交集,但让我们在以上的例子上进行以下的尝试:
List<TarGetValueList> ListOne = new List<TarGetValueList>();
List<TarGetValueList> ListTwo= new List<TarGetValueList>();
//第一个列表增加的对象
TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 };
TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 };
TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 };
TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 };
//第二个列表增加的对象
TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };
TarGetValueList FiveTwo = new TarGetValueList() { TargetValue = 5.0 };
//第一个列表增加对象
ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7
//第二个列表增加对象
ListTwo.Add(FiveTwo); ListTwo.Add(Three); //5 3
List<TarGetValueList> resultList = ListTwo.Intersect(ListOne).ToList();
第一个列表仍然是{9,6,5,7},第二个列表仍然是{5,3},得到的结果交集列表却为空了。第二个列表的5跟第一个列表的5来自不同的对象,不过对象里的值都是一样的。但Intersect函数判断它们不是交集对象,这是因为判断对象是否相等是根据它们的内存地址来判断,那我们判断对象之间相等就没办法了吗?我们重写IEqualityComparer即可:
public class TarGetComparer : IEqualityComparer<TarGetValueList>
{
public bool Equals(TarGetValueList x, TarGetValueList y)
{
try
{
return x.TargetValue == y.TargetValue;
}
catch(Exception ex)
{
return base.Equals(x);
}
} public int GetHashCode(TarGetValueList obj)
{
return obj.TargetValue.GetHashCode();
}
}
List<TarGetValueList> ListOne = new List<TarGetValueList>();
List<TarGetValueList> ListTwo= new List<TarGetValueList>();
//第一个列表增加的对象
TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 };
TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 };
TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 };
TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 };
//第二个列表增加的对象
TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };
TarGetValueList FiveTwo = new TarGetValueList() { TargetValue = 5.0 };
//第一个列表增加对象
ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7
//第二个列表增加对象
ListTwo.Add(FiveTwo); ListTwo.Add(Three); //5 3
List<TarGetValueList> resultList = ListTwo.Intersect(ListOne,new TarGetComparer()).ToList();
这样就得出了我们预期的结果{5}
c#得出两个列表的交集的更多相关文章
- C# Linq 取得两个列表的交集
我们经常会用到linq 来查询 一个数组中和另一个数组中相同的项, 这个时候就会用到IEqualityComparer接口. public class StudyInfoModel { pu ...
- python求两个列表的并集.交集.差集
求两个列表的差集 >>> a = [1,2,3] >>> b=[1,2] >>> ################################ ...
- [Swift]LeetCode986. 区间列表的交集 | Interval List Intersections
Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order ...
- 领扣(LeetCode)两个列表的最小索引总和 个人题解
假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答 ...
- leetcode 986. 区间列表的交集
问题描述 给定两个由一些 闭区间 组成的列表,每个区间列表都是成对不相交的,并且已经排序. 返回这两个区间列表的交集. (形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合, ...
- 取两个DataTable的交集,删除重复数据
/// <summary> /// 取两个DataTable的交集,删除重复数据 /// </summary> /// <param name="sourceD ...
- js取两个数组的交集|差集|并集|补集|去重示例代码
http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...
- 求两个集合的交集和并集C#
我是用hashset<T>来实现的 具体如代码所示 using System; using System.Collections.Generic; using System.Linq; u ...
- 9月23日JavaScript作业----两个列表之间移动数据
作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...
随机推荐
- Python - 利用词云wordcloud,jieba和中国地图制作四大名著的热词图
热词图很酷炫,也非常适合热点事件,抓住重点,以图文结合的方式表现出来,很有冲击力.下面这段代码是制作热词图的,用到了以下技术: jieba,把文本分词 wordcloud,制作热图 chardet,辨 ...
- secureCRT常用操作
直接在网上搜索下载 连接 选择协议 Telnet Telnet连接时,进入输入密码 串口 连接串口后,查看本机连接的串口号 新建的时候,选择相同的串口号 RTS需要勾选掉 外观字体 选项 => ...
- 用多线程,实现并发,TCP
首先,开启新的线程,是不会新开辟内存空间的,即,子线程和主线程 都在同一个进程里,也就是主进程里,用os.pid(),os.ppid() 服务器: 方式一:Thread实例化 def task(con ...
- JasperReports入门教程(二):中文打印
JasperReports入门教程(二):中文打印 背景 在上一篇中我们介绍了JasperReport的基本入门,也展示了一个报表.但是我们的示例都是使用的英文,如果我们把需要打印的数据改为中文会怎么 ...
- ubuntu安装Python3并与Python2自由切换
一.配置ssh链接安装openssh-server sudo apt-get install openssh-server 二.安装Python3及pip sudo apt-get install p ...
- python机器学习的常用算法
Python机器学习 学习意味着通过学习或经验获得知识或技能.基于此,我们可以定义机器学习(ML)如下 - 它可以被定义为计算机科学领域,更具体地说是人工智能的应用,其为计算机系统提供了学习数据和从经 ...
- markdownPad常用功能示例
1.列表 无序列表 姓名 张三 李四 王五 有序列表 张三 李四 王五 2.超链接 百度 3.引用 锄禾日当午,汗滴禾下土.谁知盘中餐,粒粒皆辛苦. -- 李绅<古风二首> 4.简要修饰文 ...
- Ubuntu 设置 log 级别
Linux环境下使用rsyslog管理日志 rsyslog linux运维 linux 22.7k 次阅读 · 读完需要 22 分钟 在 Linux 系统中,日志文件记录了系统中包括内核. ...
- Openstack Keystone V3 利用 curl 命令获取 token
curl -i \ -H "Content-Type: application/json" \ -d ' { "auth": { "identity& ...
- Imagelab-0-QT label显示 opencv 图像
Imagelab-0-QT label显示 opencv 图像 opencvc++qtimagelab 开始之前 这其实也是opencv 处理图像的系列, 只是想我们在进一步复杂化我们的代码之前, 每 ...