C# 两个集合比较差值 Linq的Except的用法

C# 两个集合比较差值 Linq的Except的用法

值类型的集合比较差值

    List<string> strList1 = new List<string>(){"a", "b", "c", "d"};
    List<string> strList2 = new List<string>() { "a", "b", "f", "e"};

    var strList3 = strList1.Except(strList2).ToList();
    for (int i = 0; i < strList3.Count; i++)
    {
        Console.WriteLine(strList3[i]);
    }

输出的结果是 c d

var strList3 = strList1.Except(strList2).ToList();

这里的意思是strList1中哪些是strList2中没有的,并将获得的差值存放在strList3 (即:strList1中有,strList2中没有)

var strList3 = strList2.Except(strList1).ToList();

这样输出的结果就是 f e

这里将strList1与strList2位置对调下,就是strList2中哪些是strList1中没有的存放在strList3 (即:strList2中有,strList1中没有)

引用类型的集合比较差值

首先创建Student类

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

然后创建2个List

    List<Student> studentList1=new List<Student>()
    {
        new Student(){Id = 1,Name = "小明"},
        new Student(){Id = 2,Name = "小刚"},
        new Student(){Id = 3,Name = "小红"},
    };

    List<Student> studentList2 = new List<Student>()
    {
        new Student(){Id = 1,Name = "小明"}
    };

    var studentList3 = studentList1.Except(studentList2).ToList();
    for (int i = 0; i < studentList3.Count; i++)
    {
        Console.WriteLine($"学号: {studentList3[i].Id} 姓名: {studentList3[i].Name}");
    }

结果输出

学号: 1 姓名: 小明
学号: 2 姓名: 小刚
学号: 3 姓名: 小红

这是因为Except通过使用默认的相等比较器对值进行比较,生成两个序列的差集,需要重写 Equals和GetHashCode 方法

如下:

  1. 方法一
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public override bool Equals(object obj)
        {
            if (obj is Student)
            {
                Student student = obj as Student;
                return Id == student.Id && Name == student.Name;
            }
            return false;
        }
        public override int GetHashCode()
        {
            return Id.GetHashCode() ^ Name.GetHashCode();
        }
    }
  1. 方法二重写一个类让它继承IEqualityComparer
    public class StudentComparer: IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            return x.Id == y.Id && x.Name == y.Name;
        }

        public int GetHashCode(Student obj)
        {
            return obj.Id.GetHashCode() ^ obj.Name.GetHashCode();
        }
    }

***** 特别注意

var studentList3 = studentList1.Except(studentList2,new StudentComparer()).ToList();

这里需要加上参数 new StudentComparer()

原文地址:https://www.cnblogs.com/xinianxinqix/p/9204534.html

时间: 2024-11-05 16:03:35

C# 两个集合比较差值 Linq的Except的用法的相关文章

oracle计算两个时间的差值(XX天XX时XX分XX秒)

在工作中需要计算两个时间的差值,结束时间 - 开始时间,又不想在js里写function,也不想在java里去计算,干脆就在数据库做了一个函数来计算两个时间的差值.格式为XX天XX时XX分XX秒: 上代码: CREATE OR REPLACE FUNCTION F_GET_DIFF_TIME(START_TIME IN DATE, END_TIME IN DATE) RETURN VARCHAR2 IS DIFF_TIME VARCHAR2(50); BEGIN SELECT TDAY || '

计算两个DateTime的差值

基本做法(d2的日期应大于d1的日期,d1.Subtract(d2)返回的不是负数,而是0): 若想算"2017-2-13 23:59:59"到"2017-2-14 0:00:01"这两个时间相差的天数,那应该是1天,但是用上述的代码得到的只有2秒的时间差,若想知道天数的差值,应先进行转换,去掉时分秒(Convert.ToDateTime(aimTime.ToShortDateString())):

两个集合求差

需求:从两个不同历史版本的数据库提取出相同的表数据(多个表)进行差异对比. 实施:使用集合的Except扩展方法 过程:开始想的是写代码循环比较差异,但是代码写起来比较繁琐,后来发现集合有一个Except扩展方法正是用来实现求差集的. 部分代码如下 EnumerableRowCollection<HtRefInfo> hta; EnumerableRowCollection<HtRefInfo> htb; hta = DalA.LoadHt(ids); htb = DalB.Loa

【峰回路转】Excel技巧百例 08.计算两个日期的差值

在Excel中如果快速计算两个日期之间的差? 例如A日期为:2012/3/12   B日期为:2015/7/29  那么这两个日期之间差几年,差几个月,差多少天? 我们使用DateDif 函数来处理. 例如: =DATEDIF(A2,B2,"y") =DATEDIF(A2,B2,"m") =DATEDIF(A2,B2,"d") 如果要计算两个日期之间的天数差,也可以不使用函数,Excel中可以进行隐式转换 版权声明:本文为博主原创文章,未经博主允

SQL_计算两个日期之间差值

select DATEDIFF(D,'2012-06-01','2014-09-21') as 相差天数 select DATEDIFF(HH,'2012-06-01','2014-09-21') as 相差小时数 ps:DATEDIFF()函数用法 语法DATEDIFF(datepart,startdate,enddate)参数datepart日期区分startdate开始日期enddate结束日期 datepart 缩写 年 yy, yyyy 季度 qq, q 月 mm, m 年中的日 dy

按小时计算两个时间的差值,结果精确到分钟

SELECT  ROUND(( DATEDIFF(minute, '2014/1/3 18:40:00', '2014/1/4 20:00:00') )              / CONVERT(FLOAT, 60), 1) AS DiffDate

moment实现计算两个时间的差值

var m1 = moment('2018-08-14 11:00:00'), m2 = moment('2018-08-14 12:10:00'); console.log(m1)console.log(m2)console.log(m2.diff(m1, 'minute')); minute为分钟,可更改为秒或毫秒,具体看官方说明 原文地址:https://www.cnblogs.com/licurry/p/9476351.html

PHP中比较两个时间的大小与日期的差值

在这里我们全用到时间戳 mktime(hour,minute,second,month,day,year,[is_dst])     其参数可以从右向左省略,任何省略的参数都会被设置成本地日期和时间的当前值. 参数 描述 hour 可选.规定小时. minute 可选.规定分钟. second 可选.规定秒. month 可选.规定用数字表示的月. day 可选.规定天. year 可选.规定年.在某些系统上,合法值介于 1901 – 2038 之间.不过在 php教程 5 中已经不存在这个限制

MySQL计算相邻两行某列差值的方法

简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后面有时间了,还需重新自我温习一下前面所写的内容,并且继续耕耘后面的算法知识. 今天稍微有点时间,总结一下博主近期工作中所遇到的一些难题,希望借此机遇总结一下类似问题的解决方法,也算是一种积累吧. 背景 我们在司机的手机APP里预置了定时上报GPS数据的功能,功能设置为了APP每15秒收集一次GPS定位地址,然