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

    VMware的问题 VMware总是搞一些事情,比如隔三差五就打不开了.那么怎么办呢?以前总要把Vm的安装程序重新开始一遍,然后选择修复 但是呢?这样太麻烦了,前几月做web开发的时候接触了Apach ...

  2. vue实现简单评分效果

  3. Linux下定时任务Crontab的使用

    使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令.例如系统管理员安排一个备份任务使其每天都运行   入门 # crontab –e 这样可以已编辑模式打开个人的cro ...

  4. CSS 文本垂直居中对齐

    文本垂直居中对齐是一个很常见的问题,这里总结一下. 一.容器高度固定,单行文本垂直居中对齐 height:20px; line-height:20px; overflow:hidden; 二.容器高度 ...

  5. 关于swagger文档的使用方法

    引言 最近在后台开发的时候,使用swagger2进行前后台接口文档的声明.由此遇见的一些问题,写下来给自己复习. 参考: https://blog.csdn.net/xupeng874395012/a ...

  6. maven创建多模块项目

    在eclipse下构建maven项目,该项目由多个子模块组成. 1.创建一个父项目 NEW -->project-->maven-->maven Project,点击下一步,进入ne ...

  7. python模块--如何相互调用自己写的模块

    一.模块相互调用同级目录调用时的两种方法 import module print(module.add(3,8)) from module import add print(add(2,4)) 同级目 ...

  8. 制作Windows XP万能克隆镜像

    制作Windows XP万能克隆镜像 战前分析:对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP为了防止盗版,采取了激活机制,当硬件发生改变时,系统就会要求 ...

  9. bzoj 3158 千钧一发——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 发现偶数之间一定满足第二个条件:奇数之间一定满足第一个条件 ( \( (2m+1)^{ ...

  10. json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 column 33 (char 33)

    json.loads(s) returns error message like this: ValueError: Invalid control character at: line 1 colu ...