实际开发中,我们经常会把同类型的一系列对象封装到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. java程序编写需注意的问题

    初学java,免不了很多注意事项 加分号 类名与文件名一致 javac fileName而非javac fileName.class ```java System.out.println(" ...

  2. ptr_fun

    ptr_fun 分类: C/C++2012-05-05 20:21 593人阅读 评论(0) 收藏 举报 functionclassfunobjectreturningtypes   目录(?)[-] ...

  3. .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?

    本文将解释在 .NET 技术栈中各种不同使用方式下 N E T 三个字母何时大写何时小写:前面的 “.” 什么时候加上,什么时候去掉,什么时候又使用 “dot”.   .NET 在技术文档中 如果你阅 ...

  4. 如何通过eclipse查看、阅读hadoop2.4源码

    问题导读:1.官网src包下载包,能否直接使用?2.如何跟踪和查看hadoop源码? 此篇是从零教你如何获取hadoop2.4源码并使用eclipse关联hadoop2.4源码基础上的一个继续,上文其 ...

  5. 《DSP using MATLAB》第7章开始 Example7.1

    FIR低通滤波器的设计要求示意图:

  6. 船长带你看书——《selenium2 python 自动化测试实战》(1)

    有很多selenium的教程,你没有从头看,当你看的时候已经很难跟上作者的节奏了.现在,你有机会再从头学一次了.从今天开始,船长会从最基本的知识开始,和大家一起学selenium.能不能跟着一起就看大 ...

  7. hapi lab测试框架简单使用

    1. 依赖安装 yarn init yarn add lab code 2. 基本模式 const Lab = require('lab'); const Code = require('code') ...

  8. 使用Costura.Fody将源DLL合并到目标EXE

    本文为原创文章,如转载,请在网页明显位置标明原文名称.作者及网址,谢谢! 一.本文主要是使用Costura.Fody工具将源DLL合并到目标EXE,因此,需要从以下任一链接下载: ①从Github地址 ...

  9. c/c++中system函数在Linux和windows下区别

    windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h> int system(char *com ...

  10. MEF学习总结(3)---Attribute Model Programing

    上一片介绍了Primitive层,Attribute Model可以认为是对Primitive的上层实现.主要包括如下内容: 1. 一系列的Attribute来定义Import和Export 常用的有 ...