在对数组和集合的使用中,咱们一般要在添加数据以前先肯定该数组或集合中是否已经有相同的数据,以保持数组或集合中数据的惟一。对于普通类型的数组来讲,咱们只须要使用扩展方法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。