C#相等比較器的使用

在對數組和集合的使用中,咱們一般要在添加數據以前先肯定該數組或集合中是否已經有相同的數據,以保持數組或集合中數據的惟一。對於普通類型的數組來講,咱們只須要使用擴展方法Contains就能夠判斷數組中是否包含某個元素。c#

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

上面代碼返回的結果是爲True。數組

但上面只是普通類型的判斷,若是數組中存儲的是一個對象(也就是集合),而不是普通類型的數據,那直接使用Contains方法就沒法判斷了。this

有一個對象Person:code

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呢?get

首先,咱們會發現,Contains方法並非一個只有一個參數的方法,它還有另外兩個重載的方法。以下圖:string

在最後一個重載方法中,咱們能夠看到,它須要一個相等比較器,其類型是IEqualityComparer<TSource>類型,其中的TSource就是進行比較的數據類型。it

這個比較器是一個對象,咱們能夠針對Person類型建立一個比較器對象的類型:class

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。

相關文章
相關標籤/搜索