博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#相等比较器的使用
阅读量:6999 次
发布时间:2019-06-27

本文共 1643 字,大约阅读时间需要 5 分钟。

hot3.png

在对数组和集合的使用中,我们通常要在添加数据之前先确定该数组或集合中是否已经有相同的数据,以保持数组或集合中数据的唯一。对于普通类型的数组来说,我们只需要使用扩展方法Contains就可以判断数组中是否包含某个元素。

string[] str = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9"};Console.WriteLine("普通数组比较:{0}",str.Contains("6"));

上面代码返回的结果是为True。

但上面只是普通类型的判断,如果数组中存储的是一个对象(也就是集合),而不是普通类型的数据,那直接使用Contains方法就无法判断了。

有一个对象Person:

public class Person{    public string UserName { get; set; }    public Person(string username)    {        this.UserName = username;    }}

创建一个Person对象的集合,并向其中添加多个对象:

List
 list = new List
();Person p1 = new Person("石昊");list.Add(p1);Person p2 = new Person("楚阳");list.Add(p2);Person p3 = new Person("纪宁");list.Add(p3);Person p4 = new Person("叶凡");list.Add(p4);Person p5 = new Person("辰南");list.Add(p5);Person p6 = new Person("石昊");bool result1 = list.Contains(p6);Console.WriteLine("直接比较:{0}", result1);

以上程序得到的结果是False,因为使用集合的Contains方法是对两个对象进行比较,这两个对象虽然UserName相同,但并不是同一个对象。

那我要怎么检测出集合中已经有了一个名为“石昊”的Person呢?

首先,我们会发现,Contains方法并不是一个只有一个参数的方法,它还有另外两个重载的方法。如下图:152618_j1We_1756499.png

在最后一个重载方法中,我们可以看到,它需要一个相等比较器,其类型是IEqualityComparer<TSource>类型,其中的TSource就是进行比较的数据类型。

这个比较器是一个对象,我们可以针对Person类型创建一个比较器对象的类型:

public class PersonComparer : IEqualityComparer
{    public bool Equals(Person x, Person y)    {        return x.UserName == y.UserName;    }    public int GetHashCode(Person obj)    {        return base.GetHashCode();    }}

这个比较器类型需要实现IEqualityComparer<TSource>接口,在Equals方法中对两个对象的UserName字段进行比较。

这样,我们再来把list中的对象与p6对象进行比较:

bool result2 = list.Contains(p6, new PersonComparer());Console.WriteLine("加比较器:{0}", result2);

打印出来的结果是为True。

转载于:https://my.oschina.net/u/1756499/blog/306039

你可能感兴趣的文章
洛谷 P1318 积水面积
查看>>
本地git仓库提交远程失败的解决办法
查看>>
理解alivc_framework 状态机
查看>>
性能优化技巧 - 程序游标
查看>>
让DBA不再从入门到放弃,落地SQL审核的正确路径 ...
查看>>
2019年20个最佳Python人工智能和机器学习开源工具(项目) ...
查看>>
Oracle 一次疑似Bug 14283239 - High CPU/IO for dictionary SQL against SYSAUTH$的处理
查看>>
阿里云:工厂车间是一个广阔的天地,在那里大有作为
查看>>
.Net 三款工作流引擎比较:WWF、netBPM 和 ccflow
查看>>
Atom飞行手册翻译: 4.4 Atom中的序列化
查看>>
Tips For Views
查看>>
小程序中其他相关的api总结
查看>>
简单介绍 Swift on Fedora —— 在 Fedora 中使用 Swift
查看>>
在SpringAOP中如何获取方法的参数值(实体类)以及参数名
查看>>
SNMP:简单网络管理协议
查看>>
SVN和Git的比较
查看>>
Charles安装和抓包
查看>>
Java数据结构与算法(五)-双向链表
查看>>
JS字符串转换为JSON的四种方法笔记
查看>>
spring mybaits多数据源动态切换
查看>>