实际开发中,我们经常会把同类型的一系列对象封装到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 重载

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

  1. JavaScript 自定义对象

    在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式:对象直接量.new 构造函数.Objec ...

  2. java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

    import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...

  3. ios存储 plist 偏好设置 自定义对象存储

    1,plist Plist注意:不能存储自定义对象 Plist:数组和字典,  如何判断一个对象能不能使用Plist,就看下有没有writeToFile 获取应用的文件夹(应用沙盒) NSString ...

  4. Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)

    1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...

  5. Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历

    1. HashSet存储自定义对象并遍历 2. 代码示例: (1)Student类,如下: package cn.itcast_02; /** * @author Administrator * */ ...

  6. ArrayList去除重复元素(包括字符串和自定义对象)

    1.去除重复字符串 package com.online.msym; import java.util.ArrayList; import java.util.Iterator; @SuppressW ...

  7. JS自定义对象,正则表达式,JQuery中的一些知识点

    一:自定义对象 1.基本概念:①对象:包含一系列无序属性和方法的集合.②键值对:对象中的数据是以键值对的形式存在的,以键取值.③属性:描述对象特征的一系列变量.[对象中的变量]④方法:描述对象行为的一 ...

  8. JavaScript 创建和浅析自定义对象

    在Js中,除了Array.Date.Number等内置对象外,开发者可以通过Js代码创建自己的对象. 目录 1. 对象特性:描述对象的特性 2. 创建对象方式:对象直接量.new 构造函数.Objec ...

  9. 用HashSet存储自定义对象

      案例 package cn.itcast_02; import java.util.HashSet; /* * 需求:存储自定义对象,并保证元素的唯一性 * 要求:如果两个对象的成员变量值都相同, ...

随机推荐

  1. es6模块化开发

    export导出 import导入   export {a:b} Export default {a:b}

  2. Android Hook 框架 Cydia_substrate 详解

    目录(?)[-] 使用方法 短信监控实例 1.Cydia_Substrate 框架简介 Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(n ...

  3. Android:BroadcastReceiver

    参考:<第一行代码:Android> 郭霖(著)   Broadcast分类 注册方式: 动态广播 在代码中注册receiver 一定要手动在onDestroy()时调用unregiste ...

  4. [LOJ6145][2017 山东三轮集训 Day7]Easy

    loj description 一棵树,每次给出\(l,r,x\),求从点\(x\)出发到达\([l,r]\)中任意一点的最短距离. sol 动态点分治. 建出点分树后,在每个节点上用以点编号为下标的 ...

  5. rollupjs 基本试用

    备注:    前端构建工具   1. 安装 yarn global add rollup yarn global add rollup 2. 基本使用 touch index.js index.js ...

  6. 如何在CentOS系统中安装配置SNMP服务

    CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,现在有一大部分服务器在使用此操作系统:SNMP(简单网络 ...

  7. Python 函数 -range()

    range() pytho range() 函数可创建一个整数列表,一般用在 for 循环中. 语法: range(start, stop[, step]) start: 计数从 start 开始.默 ...

  8. Android.mk语法解析

    Android.mk 相当于 Linux 中的 Makefile 文件,用来向安卓系统描述如何编译源代码.该文件会被编译器解析多次,所以尽量减少在 Android.mk 中声明变量. Android. ...

  9. EF6:编写你自己的code first 数据迁移操作(睡前来一篇,翻译的)

    原英文版由EF团队成员 Rowan Miller 在2013年发表,此处只作翻译备忘. 数据迁移提供了一套强类型API,用于执行通用的操作,比如CreateIndex("dbo.Blogs& ...

  10. CXF+Spring搭建webservice服务

    Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS .这些 Services 可以支持多 ...