C#相等比较器的使用

在对数组和集合的使用中,我们通常要在添加数据之前先确定该数组或集合中是否已经有相同的数据,以保持数组或集合中数据的唯一。对于普通类型的数组来说,我们只需要使用扩展方法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<Person> list = new List<Person>();
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<Person>
{

    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值