c#提供了Intersect来得到两个列表的交集,它是通过使用默认的相等比较器对值进行比较生成两个序列的交集,定义为:

  1. public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);

我们使用它来比较两个列表试试:

  1. List<double> oneList = new List<double> { , , , };
  2. List<double> twoList = new List<double> { , };
  3. List<double> result = oneList.Intersect(twoList).ToList();

结果是{9,3}

我们再来试试对象列表

我们先定义一个模型

  1. public class TarGetValueList
  2. {
  3. public double TargetValue { get; set; }
  4.  
  5. }

然后求交集

  1. List<TarGetValueList> ListOne = new List<TarGetValueList>();
  2. List<TarGetValueList> ListTwo= new List<TarGetValueList>();
  3. //第一个列表增加的对象
  4. TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 };
  5. TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 };
  6. TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 };
  7. TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 };
  8. //第二个列表增加的对象
  9. TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };//第一个列表增加对象
  10. ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7
  11. //第二个列表增加对象
  12. ListTwo.Add(Five); ListTwo.Add(Three); //5 3
  13. List<TarGetValueList> resultList = ListTwo.Intersect(ListOne).ToList();

第一个列表是{9,6,5,7},第二个列表是{5,3},结果交集是{5},结果在预想之内,至今为止,一切都很顺利。我们似乎已经掌握了用c#来求两个列表的交集,但让我们在以上的例子上进行以下的尝试:

  1. List<TarGetValueList> ListOne = new List<TarGetValueList>();
  2. List<TarGetValueList> ListTwo= new List<TarGetValueList>();
  3. //第一个列表增加的对象
  4. TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 };
  5. TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 };
  6. TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 };
  7. TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 };
  8. //第二个列表增加的对象
  9. TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };
  10. TarGetValueList FiveTwo = new TarGetValueList() { TargetValue = 5.0 };
  11. //第一个列表增加对象
  12. ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7
  13. //第二个列表增加对象
  14. ListTwo.Add(FiveTwo); ListTwo.Add(Three); //5 3
  15. List<TarGetValueList> resultList = ListTwo.Intersect(ListOne).ToList();

第一个列表仍然是{9,6,5,7},第二个列表仍然是{5,3},得到的结果交集列表却为空了。第二个列表的5跟第一个列表的5来自不同的对象,不过对象里的值都是一样的。但Intersect函数判断它们不是交集对象,这是因为判断对象是否相等是根据它们的内存地址来判断,那我们判断对象之间相等就没办法了吗?我们重写IEqualityComparer即可:

  1. public class TarGetComparer : IEqualityComparer<TarGetValueList>
  2. {
  3. public bool Equals(TarGetValueList x, TarGetValueList y)
  4. {
  5. try
  6. {
  7. return x.TargetValue == y.TargetValue;
  8. }
  9. catch(Exception ex)
  10. {
  11. return base.Equals(x);
  12. }
  13. }
  14.  
  15. public int GetHashCode(TarGetValueList obj)
  16. {
  17. return obj.TargetValue.GetHashCode();
  18. }
  19. }
  1. List<TarGetValueList> ListOne = new List<TarGetValueList>();
  2. List<TarGetValueList> ListTwo= new List<TarGetValueList>();
  3. //第一个列表增加的对象
  4. TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 };
  5. TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 };
  6. TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 };
  7. TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 };
  8. //第二个列表增加的对象
  9. TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };
  10. TarGetValueList FiveTwo = new TarGetValueList() { TargetValue = 5.0 };
  11. //第一个列表增加对象
  12. ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7
  13. //第二个列表增加对象
  14. ListTwo.Add(FiveTwo); ListTwo.Add(Three); //5 3
  15. 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. java多线程3:原子性,可见性,有序性

    概念 在了解线程安全问题之前,必须先知道为什么需要并发,并发给我们带来什么问题. 为什么需要并发,多线程? 时代的召唤,为了更充分的利用多核CPU的计算能力,多个线程程序可通过提高处理器的资源利用率来 ...

  2. shiro:自定义remle(二)

    SpringMVC+SpringMVC+Mybatis项目 1:导入相关依赖 <dependencies> <!--测试依赖--> <dependency> < ...

  3. BIOS时间与系统时间(windows/linux时间同步问题)

    写作动机 双系统是不少人喜欢的方式,但安装双系统之后一般会出现两个系统时间不一样的问题,刚开始用双系统的时候也没怎么在意,就是装上后在网上找找相关解决方法,复制粘贴代码完事儿.但是次数多了就有点烦了, ...

  4. python实现线性回归之简单回归

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 首先定义一个基本的回归类,作为各种回归方法的基类: class Regression(o ...

  5. c++库 c语言接口

    //code in add.cxx #include "add.h" int sample::method() { cout<<"method is call ...

  6. Cobbler自动装机试验

    Cobbler自动装机简介:Cobbler是一个使用Python开发的开源项目,通过将部署系统所涉及的所有服务集中在一起,来提供一个全自动的批量快速建立Linux系统的网络安装环境.Cobbler提供 ...

  7. Java实现zip文件解压[到指定目录]

    2019独角兽企业重金招聘Python工程师标准>>> package com.ljheee.ziptool.core; import java.io.File; import ja ...

  8. IT成长中的龟兔赛跑

    IT成长中的龟兔赛跑 相信"龟兔赛跑"的故事大家都听过吧,那就让咱给各位看官讲讲我看到的一些事情吧.      最近看到很多文章总是叹息网管如何,起得比鸡早,睡得比狗晚,吃得比猪差 ...

  9. double运算的坑

    某个结果运算后,得出的数据:a = 15.599999999 而不是15.6,导致条件判断 a < 15.6 为true,使程序出现bug 解决办法,对运算后的浮点数,进行格式化(以保留一位小数 ...

  10. 【阅读笔记】Ranking Relevance in Yahoo Search (三)—— query rewriting

    5. QUERY REWRITING 作用: query rewriting is the task of altering a given query so that it will get bet ...