两个List集合做数据对比

List集合做数据对比

在开发中我们经常会遇到集合,以及求集合的交集、差集、全集 等问题。在菜鸟时期我们可能会使用for循环来处理,但是这不是长久之计,不仅性能会受到损耗,还会影响同事的身体健康,因为你提交代码后,在同事看到会笑掉大牙。



前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


差集[Except]

差集的介绍

在这里插入图片描述

比如集合A和集合B,
A和B的差集就是A集合中有的而B集合没有的,也就是灰色的部分。


C#中List中自带的差集计算方法

List 继承了Enumerable ,Enumerable 中有一个Except方法
在这里插入图片描述
它有两个实现:

  • 第一个实现是通过使用默认的相等比较器对值进行比较,生成两个序列的差集。
  • 第二个实现是通过使用指定的 IEqualityComparer 对值进行比较,生成两个序列的差集。

简单数值对比

这是用默认的相等对比器
这种方式一般都是用来比较简单数组或者字符串内容

double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

这里的输出结果:
2
2.1
2.3
2.4
2.5


List对象数组对比

方式一

使用指定的 IEqualityComparer 对值进行比较
这种可以用来对比对象集合

模型

namespace 测试项目.Test
{
	public class test{
		public int id{get;set;}
		public string name{get;set;}
		public string tel{get;set;}
		public int age{get;set;}
		public string clas{get;set;}
	}
  public class testComparer : IEqualityComparer<test>
    {
        public bool Equals(test x, test y)
        {
            return x.name== y.name && x.tel== y.tel;
        }

        public int GetHashCode(test obj)
        {
            return obj.name.GetHashCode() ^ obj.tel.GetHashCode();
        }
    }
}

使用方法:

List<test> list=...这是第一个对象集合
List<test> list2=...这是第二个集合


 var different = list.Except(list2,new testComparer()).ToList();
 这是查询第一个集合里有但是第二个集合里面没有的数据

方式二

注意这种方式必须要两个集合的同一个对象才可以用

var result = 集合A.Where(x =>! 集合B.Any(e => e.id== x.id)).ToList();

交集[Intersect]

交集的介绍

在这里插入图片描述
集合A和B共有的数据,也就是图中灰色部分


C#中List中自带的交集计算方法

在这里插入图片描述
它和”Except“类似同样有两个实现:

  • 第一个实现是通过使用默认的相等比较器对值进行比较,生成两个序列的交集。
  • 第二个实现是通过使用指定的 IEqualityComparer 对值进行比较,生成两个序列的交集。

简单数值对比

这是用默认的相等对比器
这种方式一般都是用来比较简单数组或者字符串内容

double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Intersect(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

这里的输出结果:
2.2


List对象数组对比

方式一

使用指定的 IEqualityComparer 对值进行比较
这种可以用来对比对象集合

模型

namespace 测试项目.Test
{
	public class test{
		public int id{get;set;}
		public string name{get;set;}
		public string tel{get;set;}
		public int age{get;set;}
		public string clas{get;set;}
	}
  public class testComparer : IEqualityComparer<test>
    {
        public bool Equals(test x, test y)
        {
        //这里是用于判断相同的依据字段
            return x.name== y.name && x.tel== y.tel;
        }

        public int GetHashCode(test obj)
        {
            return obj.name.GetHashCode() ^ obj.tel.GetHashCode();
        }
    }
}

使用方法:

List<test> list=...这是第一个对象集合
List<test> list2=...这是第二个集合


 var different = list.Intersect(list2,new testComparer()).ToList();
 这是查询第一个对象集合和第二个对象集合共有的对象。

方式二

注意这种方式必须要两个集合的同一个对象才可以用

var result = 集合A.Where(x =>集合B.Any(e => e.id== x.id)).ToList();

并集[Union]

并集介绍

在这里插入图片描述
A和B的数据合并在一起的值,也就是灰色范围的值

C#中List中自带的并集计算方法

在这里插入图片描述

它也和”Except“类似同样有两个实现:

  • 第一个实现是通过使用默认的相等比较器对值进行比较,生成两个序列的交集。
  • 第二个实现是通过使用指定的 IEqualityComparer 对值进行比较,生成两个序列的交集。

简单数值对比

这是用默认的相等对比器
这种方式一般都是用来比较简单数组或者字符串内容

double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Union(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

这里的输出结果:
2
2.1
2.2
2.3
2.4
2.5


List对象数组对比

方式一

使用指定的 IEqualityComparer 对值进行比较
这种可以用来对比对象集合

模型

namespace 测试项目.Test
{
	public class test{
		public int id{get;set;}
		public string name{get;set;}
		public string tel{get;set;}
		public int age{get;set;}
		public string clas{get;set;}
	}
  public class testComparer : IEqualityComparer<test>
    {
        public bool Equals(test x, test y)
        {
        //这里是用于判断相同的依据字段
            return x.name== y.name && x.tel== y.tel;
        }

        public int GetHashCode(test obj)
        {
            return obj.name.GetHashCode() ^ obj.tel.GetHashCode();
        }
    }
}

使用方法:

List<test> list=...这是第一个对象集合
List<test> list2=...这是第二个集合


 var different = list.Union(list2,new testComparer()).ToList();
 这是将第一个集合和第二个集合合并在一起,会根据testComparer里的字段去除重复的对象。

方式二

注意这种方式必须要两个集合的同一个对象才可以用

var result = 集合A.Union(集合B).ToList();

全集[Concat]

注意:全集会去除重复的值而并集不会去除

C#中List中自带的交集计算方法

在这里插入图片描述
它也和”Except“类似同样有两个实现:

  • 第一个实现是通过使用默认的相等比较器对值进行比较,生成两个序列的交集。
  • 第二个实现是通过使用指定的 IEqualityComparer 对值进行比较,生成两个序列的交集。

简单数值对比

这是用默认的相等对比器
这种方式一般都是用来比较简单数组或者字符串内容

double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers1.Concat(numbers2);

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

这里的输出结果:
2
2.1
2.2
2.2
2.3
2.4
2.5


List对象数组对比

使用指定的 IEqualityComparer 对值进行比较
这种可以用来对比对象集合

模型

namespace 测试项目.Test
{
	public class test{
		public int id{get;set;}
		public string name{get;set;}
		public string tel{get;set;}
		public int age{get;set;}
		public string clas{get;set;}
	}
  public class testComparer : IEqualityComparer<test>
    {
        public bool Equals(test x, test y)
        {
        //这里是用于判断相同的依据字段
            return x.name== y.name && x.tel== y.tel;
        }

        public int GetHashCode(test obj)
        {
            return obj.name.GetHashCode() ^ obj.tel.GetHashCode();
        }
    }
}

使用方法:

List<test> list=...这是第一个对象集合
List<test> list2=...这是第二个集合


 var different = list.Concat(list2,new testComparer()).ToList();
 这是将第一个集合和第二个集合合并在一起,会保留重复的对象。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

或与且与或非

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值