c#得出两个列表的交集

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

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

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

            List<double> oneList = new List<double> { 9, 8, 5, 3 };
            List<double> twoList = new List<double> { 9, 3 };
            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}

原文地址:https://www.cnblogs.com/ssvip/p/12103656.html

时间: 2024-10-24 06:03:19

c#得出两个列表的交集的相关文章

[原]关于对求两个排序数组交集的扫描算法正确性的证明

在看<信息检索导论>的时候看到了这个算法的实现,书里是用来演示如何将两个term的倒排列表求交集.伪代码如下: INTERSECT( p1, p2 ) 1 answer ← {} 2 while p1 != NIL and p2 != NIL do 3   if docID( p1) = docID( p2 ) then 4     ADD( answer, docI D( p1 ) ) 5     p1 ← next( p1 ) 6     p2 ← next( p2 ) 7   else

两个数组取交集的算法

在Lucene中,如果用户的查询向量Term t = {xx,xx,……},BooleanQuery为AND时,每个t---->对应得到的倒排列表,倒排列表由许多的倒排索引项构成,然后取其中重复的文档编号,然后进行排序.器核心思想类似于如下问题: 现有两个数组:int []data1 = {12,45,65,2,5} int []data2 = {12,5,-8,9},取其中的交集. 实现的方案有很多,现在采取一种时间和空间相对较好的算法:集合压缩算法,即:1.分别计算两个数组的min和max(

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

假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅. 如果答案不止一个,则输出所有答案并且不考虑顺序. 你可以假设总是存在一个答案. 示例 1: 输入: ["Shogun", "Tapioca Express", "Burger King", "KFC"] ["Piatti", "T

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

Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order. Return the intersection of these two interval lists. (Formally, a closed interval [a, b] (with a <= b) denotes the set of real numbers x with a <=

【python-leetcode42-区间合并】区间列表的交集

问题描述: 给定两个由一些闭区间组成的列表,每个区间列表都是成对不相交的,并且已经排序. 返回这两个区间列表的交集. (形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b.两个闭区间的交集是一组实数,要么为空集,要么为闭区间.例如,[1, 3] 和 [2, 4] 的交集为 [2, 3].) 示例: 输入:A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]

哈希(4) - 求两个链表的交集(intersection)以及并集(union)

给定两个链表,求它们的交集以及并集.用于输出的list中的元素顺序可不予考虑. 例子: 输入下面两个链表: list1: 10->15->4->20 list2: 8->4->2->10 输出链表: 交集list: 4->10 并集list: 2->8->20->4->15->10 方法1 (简单方法) 可以参考链表系列中的"链表操作 - 求两个链表的交集(intersection)以及并集(union)" 方法2

python 如何在一个for循环中遍历两个列表

是我在看<笨方法学python>过程中发现有一行代码看不懂——“ for sentence in snippet, phrase:”,所以研究了半天,感觉挺有收获的.所以就放在博客上分享给大家了. 直入主题: 为了不耽误大家时间,如果知道以下为两段代码为什么输出不一样的话我觉得您肯定知道我下面要说的是什么了,您就不必花时间再读下去了. 1和2两段代码的区别是print在for循环中,另外一个是不在循环中.输出的结果却截然不同,如果想要弄懂如何遍历两列表,花些时间把下面的几行代码弄懂.我要说的您

求两个数组的交集

问题: 给你两个排序的数组,求两个数组的交集. 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5. 思路: 1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存.该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度. 2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分查找看是否在数组A里有B所对应的值,这样复杂度变成了O(N lg M). 这里,如果N 比 M 大,可以从A中取值,然后在B中判断是否有A

python中实现两个列表同时输出元素的方法zip

记:这个问题其实曾经在群里向一些同学求教过,但是在后来的写程序的过程,又把这个方法忘记了,所以今天在这里把这个问题说明下,以免下次再犯同样的问题! 假设有两个列表 a = [1,2,3,4,5,], b = [6,7,8,9,10],现在要求分别从这两个列表中输出元素,则可以使用for循环来实现这个功能 程序: for item1, item2 in zip(a, b): print "a:%s, b:%s" %(item1, item2) 结果如下: a:1 ,b:6 a:2 ,b: