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#得出两个列表的交集的更多相关文章

  1. C# Linq 取得两个列表的交集

    我们经常会用到linq 来查询 一个数组中和另一个数组中相同的项, 这个时候就会用到IEqualityComparer接口. public class StudyInfoModel {      pu ...

  2. python求两个列表的并集.交集.差集

    求两个列表的差集 >>> a = [1,2,3] >>> b=[1,2] >>> ################################ ...

  3. [Swift]LeetCode986. 区间列表的交集 | Interval List Intersections

    Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order ...

  4. 领扣(LeetCode)两个列表的最小索引总和 个人题解

    假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答 ...

  5. leetcode 986. 区间列表的交集

    问题描述 给定两个由一些 闭区间 组成的列表,每个区间列表都是成对不相交的,并且已经排序. 返回这两个区间列表的交集. (形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合, ...

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

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

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

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

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

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

  9. 9月23日JavaScript作业----两个列表之间移动数据

    作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...

随机推荐

  1. 《并发编程的艺术》阅读笔记之Sychronized

    概述 在JDK1.6中,锁一共四种状态,级别由低到高依次是:无锁状态.偏向锁状态.轻量级锁状态和重量级锁状态.锁可以升级但不能降级,这是为了提高获得锁和释放锁的效率.只有重量级锁涉及到操作系统线程切换 ...

  2. Python爬虫---爬取腾讯动漫全站漫画

    目录 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源网页代码 下载漫画图片 下载结果 完整 ...

  3. java Int类型转为double 类型;string转double

    int a=12; double b=(double)a; or double c=Double.valueOf((double)a); string a_s="12"; doub ...

  4. 前端基础-HTML(1)

    1.浏览器: 1.1 浏览器内核: 渲染引擎和JS引擎 渲染引擎:负责页面内容的在(html,xml,图像等).整理讯息(加入css等),以及计算网页的显示方式,然后输出至显示器后者打印机 JS引擎: ...

  5. java 8中构建无限的stream

    目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...

  6. 【React踩坑记六】create-react-app创建的react项目通过iP地址访问(实现局域网内访问)

    同项目组的小伙伴想用自己的电脑访问我电脑上开发阶段的create-react-app创建的react项目. 试过了了各种内网穿透工具ngrok以及localtunnel等. 奈何打开效率实在太过于龟速 ...

  7. JS编程建议——11:慎重使用伪数组

    建议11:慎重使用伪数组JavaScript没有真正的数组,因此typeof运算符不能辨别数组和对象.伪数组在JavaScript中有很高的易用性,程序员不用给它设置维度,而且永远不用担心产生越界错误 ...

  8. Azkaban3.81.x部署+坑

    一.前提安装 1.1 Java1.8环境搭建 1) 下载jdk1.8并解压: # tar -zxvf jdk-8u201-linux-i586.tar.gz -C /usr/local 2) 添加Ja ...

  9. 图论--BFS总结

    1.关于BFS的Key_word: ①hash或状态压缩记录状态  ②状态剪枝 ③反向BFS ④双向BFS ⑤特殊初始化VIS数组 ⑥动态图的搜索 ⑦优先队列优化搜索 ⑧数位搜索 下面是一一讲解: 1 ...

  10. postman(动态数据获取)

    一:返回报文为 json 格式 示例:因为充值记录接口中需要用到登录接口返回报文中的信息如下 1.以获取token(JWT)和uid为例 2.在登录接口的tests中写入代码(因为登录接口报文信息中有 ...