重写类的Equals以及重写Linq下的Distinct方法
当自定义一个类的时候,如果需要用到对比的功能,可以自己重写Equals方法,最整洁的方法是重写GetHashCode()方法。
但是,这个方法只适用于对象自身的对比(如if(a==b))以及字典下的Contains(如dicTest.Contains<T>(a)),在Linq下的Distinct下无效。
Linq下的Distinct需要我们再写一个继承IEqualityComparer的类,分别如下
using System.Collections.Generic; namespace ServiceEngine.Model
{
public class Market
{
/// <summary>
/// 区域名称
/// </summary>
public string RegionName { get; set; }
/// <summary>
/// 市场名称
/// </summary>
public string Name { get; set; } public override bool Equals(object obj)
{
if (obj == null)
return false;
if (obj.GetType() != this.GetType())
return false; Market m = obj as Market;
return m.Name == this.Name && m.RegionName == this.RegionName;
} public override int GetHashCode()
{
return this.Name.GetHashCode() ^ this.RegionName.GetHashCode();
}
}
}
重写类的Equals
using System.Collections.Generic; namespace ServiceEngine.Model
{
public class Market
{
/// <summary>
/// 区域名称
/// </summary>
public string RegionName { get; set; }
/// <summary>
/// 市场名称
/// </summary>
public string Name { get; set; } public override bool Equals(object obj)
{
if (obj == null)
return false;
if (obj.GetType() != this.GetType())
return false; Market m = obj as Market;
return m.Name == this.Name && m.RegionName == this.RegionName;
} public override int GetHashCode()
{
return this.Name.GetHashCode() ^ this.RegionName.GetHashCode();
}
} public class MarketComparer : IEqualityComparer<Market>
{
public bool Equals(Market x, Market y)
{
return x.Name == y.Name && x.RegionName == y.RegionName;
} public int GetHashCode(Market obj)
{
return obj.Name.GetHashCode() ^ obj.RegionName.GetHashCode();
}
}
}
重写Linq下的Distinct方法
var xx = lstMarkets.Distinct<Market>(new MarketComparer()).ToList();
Linq下的Distinct调用
重写类的Equals以及重写Linq下的Distinct方法的更多相关文章
- 注意重写类的equals()方法
注意在java中在比较引用类型时==和原生的equals()方法比较的都是看它们否是同一个对象(说的更直白一点就是他们在内存的位置是否是一样的),但我们在真实世界中关注的往往只是其中的某个属性是否相等 ...
- List中的Contains方法内部其实是用对象的equals方法做比较,所以如果比较两个类就重写类的equals方法即可;而Set是调用equals和hashCode
public class Person { private String name; private int age; public String getName() { return name; } ...
- Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦
一:背景 1. 讲故事 前几天看同事在用 linq 给内存中的两个 model 做左连接,用过的朋友都知道,你一定少不了一个叫做 DefaultIfEmpty 函数,这玩意吧,本来很流畅的 from. ...
- 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()
java编程里有关约定:如果两个对象根据equals方法比较是相等的,那么调用这两个对象的任意一个hashcode方法都必须产生相同的结果. hashcode()和equals()都继承于object ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- object类的equals方法简介 & String类重写equals方法
object类中equals方法源码如下所示 public boolean equals(Object obj) { return this == obj; } Object中的equals方法是直接 ...
- 2019-1-19 object祖宗类的equals重写
package com.test; /** * object祖宗类的equals重写 * @author Mr.kemi *2019-1-19 */ public class Equals { pri ...
- 为什么要重写 hashcode 和 equals 方法?
引言 以前面试的时候被面试官问到过这样一个问题: 你有没有重写过 hashCode 方法? 心里想着我没事重写哪玩意干啥,能不写就不写.嘴上当然没敢这么说,只能略表遗憾的说抱歉,我没写过. 撇了面试官 ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
随机推荐
- SQLAchemy、MYSQL、PYMYSQL
什么是数据库? 个人理解:将一些有关系的数据组织在一起,并建立一定规则便于查询.修改.删除我们关系的数据仓库. 常用的数据库:mysql.oracle.sqlserver等. 接下来我们主要讲mysq ...
- Android之自定义控件-下拉刷新
实现效果: 图片素材: --> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml: <resources> <string name=& ...
- 3.Complementing a Strand of DNA
Problem In DNA strings, symbols 'A' and 'T' are complements of each other, as are 'C' and 'G'. The r ...
- 如何配置Windows 防火墙,允许SQL Server的远程连接
一.如何找到SQL Server正在侦听的TCP端口,可以按一下步骤: 1.打开 SQL Server 配置管理器中,从开始->所有程序-> Microsoft SQL Server 20 ...
- Eclipse+Tomcat搭建https环境
一.首先在本地建立一个keystore文件 用命令:keytool -v -genkey -alias tomcat -keyalg RSA -keystore c:/tomcat.keystore ...
- SpringMVC,3种不同的URL路由配置方法
1. 先说说一种比较常见的: <servlet> <servlet-name>theDispatcher</servlet-name> <servlet-cl ...
- Apache Nutch build文件解析
本文目的:分析Apache Nutch 1.9的build.xml文件,从而让读者了解nutch的build全部流程
- 关于js中空值比较和传值的问题
昨天写导出功能时,有个条件审核状态,其中一个审核状态的key为0,我也是醉了. 然后我注意到这方面的问题,在网上找了找,我的理解可能有点问题.但是目前也就是这样了,以后在学习吧! 正文: js中各种类 ...
- Pyside开篇杂记
最近学习刚开始学习pyside,基本了解了一些类的用法,个人感觉就接触而言与pyqt并无本质区别. 双方资料基本可以相互借鉴,个人更倾向与pyside,查阅资料时也经常会在pyqt内得到解决方案. 之 ...
- 记一次ifconfig命令
由于Windows 10的强制更新,原来的Virtual box Host-Only驱动莫名奇妙的不见了,于是上网找各种解决方案: 1.重新生成虚拟网卡适配器:执行 VBoxManage.exe ho ...