在对数组和集合的使用中,我们通常要在添加数据之前先确定该数组或集合中是否已经有相同的数据,以保持数组或集合中数据的唯一。对于普通类型的数组来说,我们只需要使用扩展方法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对象的集合,并向其中添加多个对象:
Listlist = 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方法并不是一个只有一个参数的方法,它还有另外两个重载的方法。如下图:
在最后一个重载方法中,我们可以看到,它需要一个相等比较器,其类型是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。