C# List对于自定义对象的比较判断

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

  实际开发中,我们经常会把同类型的一系列对象封装到List集合中,当我们有需要在封装对象到List集合中时,排除重复的对象,这时直接使用:

if(!List.Contains(obj))
{
List.Add(bj);
}

   在使用List对象,当T为自定义类型时,使用Contain方法将导致错误的返回结果。List.Contains(obj)比较的是:原来List集合中的对象的储存地址和当前需要添加对象obj在堆中储存的地址 ,所以即便有两个对象相等,但是它们储存的地址不同,所以List.Contains仍然返回false。下面主要使用如下两种方法来解决该问题。

1、实现 IEqualityComparer接口

public class PopupComparer : IEqualityComparer<KeyValuePair<string , double>>
{
public static PopupComparer Default = new PopupComparer();
#region IEqualityComparer<PopupModel> 成员
public bool Equals(KeyValuePair<string , double> x, KeyValuePair<string , double> y)
{
return x.Key.Equals(y.Key);
}
public int GetHashCode(KeyValuePair<string , double> obj)
{
return obj.GetHashCode();
}
#endregion
}

使用

if (!lt.Contains<KeyValuePair<string, double>>(kv, PopupComparer.Default))
  lt.Add(kv);
else
  Console.ReadKey();

2、重写对象的EqualsGetHashCode方法

List.Contains(obj)调用的是obj对象对应的类的Equals()方法,我们可以按需要重写这个方法和GetHashCode()方法,即可按自己的需求来定义Contains()比较方式。

public class Person
{
private string Number;
private string personName; public Person(string name, string Number)
{
this.personName = name;
this.Number= Number;
} public bool Equals(Person p)
{
//按需求定制自己需要的比较方式
return (this.personName == p.personName && this.Number == p.Number);
} public override int GetHashCode()
{
return this.Number.GetHashCode();
}
} public class Example
{
public static void Main()
{
Person p1 = new Person("John", "");
Person p2 = new Person("Jack", "");
List<Person> List = new List<Person>();
List.Add(p1);
List.Add(p2);
Person p3 = new Person("John", "");
if(!List.Contains(p3))//没有重写前函数返回false,现在返回true
{
List.Add(p3);
}
}
}

参考文章

C# List Contains()用于引用类型的使用

C# list Contains 重载

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“C# List对于自定义对象的比较判断” 的相关文章

背景知识

80386处理器有3种工作模式:实模式,保护模式和虚拟86模式。实模式和虚拟86模式是为了和8086处理器兼容而设计的。在实模式下,80386处理器就相当于一个快速的8086处理器。保护模式是80386处理器的主要工作模式。 实模式:被复位或加电的时候以实模...

php如何修改session配置 - 编程语言

这篇文章主要介绍“php如何修改session配置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何修改session配置”文章能帮助大家解决问题。 Session 在 PHP 中是一种非常常...

2022第十三届蓝桥杯省赛C/C++B组 真题题解

目录 A.九进制转十进制 B.顺子日期 C.刷题统计 D.修剪灌木 E.X 进制减法 F.统计子矩阵 G.积木画 H.扫雷 I.李白打酒加强版 J.砍竹子 特别说明本文章运用了万能头文件#include <bits/stdc++.h>会降低代码的运...

【Boto3学习笔记】session client resource的区别和使用

目录 Boto3是什么安装和配置快速开始Session&client&resource Boto3是什么 通过适用于 Python 的 AWS 开发工具包 boto3 可以支持您轻松将 Python 应用程序、库或脚本与 AWS 服务进行集成包括 Amazon S3...

SGU 127 Telephone directory (模拟)

time limit per test: 0.5 sec.  memory limit per test: 4096 KBhttp://acm.sgu.ru/problem.php?contest=0&problem=127CIA has decided to create a s...

C++ STL入门教程(7)——multimap(一对多索引),multiset(多元集合)的使用(附完整程序代码)_c++的multiset

一、multimap(一对多索引)C++ multimap和map所支持的操作相同(除了multimap不支持下标运算),但是multimap允许重复的元素。begin()返回指向第一个元素的迭代器clear()删除所有元素count()返回一个元素出现的次数empty()如果multimap为空则...