C#数组比较(IStructuralEquatable接口)

来源:互联网 发布:nginx rtmp 直播配置 编辑:程序博客网 时间:2024/04/27 04:56

   数组和元组都实现了IStructuralEquatable和IStructuralComparable。这两个接口都是.NET4新增的
   不仅可以比较引用,还可以比较内容,IStructuralEquatable接口用于比较两个元组或数组是否有相同的内容,
   IStructuralComparable接口用于给元组或数组排序

   应用范围:可以自定义比较数组中的元素结构是否相同,例如数组是由person类元素组成的
   类由ID,FirstName,LastName三个属性构成,可以自定义按FirstName,LastName相等进行比较

   ------类定义-------------
        public class Person : IEquatable<Person>
        {
            public int ID { get; private set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }

            public override string ToString()
            {
                return
                    string.Format("{0},{1}{2}", ID, FirstName, LastName);
            }

            public override bool Equals(object obj)
            {
                if (obj == null) throw new ArgumentNullException("obj");
                return Equals(obj as Person);
            }

            public bool Equals(Person other)
            //比较代码
            {
                return this.ID == other.ID &&
                        this.FirstName == other.FirstName &&
                        this.LastName == other.LastName;               
            }

            public override int GetHashCode()
            {
                return ID.GetHashCode();
            }
        }

     ------测试代码-------------
       private void btn测试结构比较3_Click(object sender, EventArgs e)
        {
            Person[] persons1 ={
                                   new Person
                                   {
                                       FirstName="Michael",
                                       LastName="Jackson"
                                   },
                                   new Person
                                   {
                                       FirstName="Michael2",
                                       LastName="Jackson2"
                                   },
                                   new Person
                                   {
                                       FirstName="Michael3",
                                       LastName="Jackson3"
                                   }
                               };
            Person[] persons2 ={
                                   new Person
                                   {
                                       FirstName="Michael",
                                       LastName="Jackson"
                                   },
                                   new Person
                                   {
                                       FirstName="Michael2",
                                       LastName="Jackson2"
                                   },
                                   new Person
                                   {
                                       FirstName="Michael4",
                                       LastName="Jackson3"
                                   }
                               };
            if ((persons1 as IStructuralEquatable).Equals(
                persons2, EqualityComparer<Person>.Default))
            {
                Console.WriteLine("the same content");
            }
            else
            {
                Console.WriteLine("Not the same content");
            }
        }
      ------测试结果---------------
      将会输出Not the same content
      ------测试结果分析---------------
      下面代码的说明:对于IstructuralEquatable接口定义的Equals()方法,它的第一个参数是object类型,
       第二个参数是IEqualityComparer类型。调用这个方法时,通过传递一个实现了IEqualityComparer<T>的对象,就
      可以定义如何进行比较。通过EqualityComparer<T>类完成IEqualityComparer的一个默认实现。这个实现检查类型是否
      实现了IEquatable接口,并调用IEquatable.Equals()方法(即这里的Person类的Equals方法)。如果该类型没有实现IEquatable,就
      调用Object基类中的Equals()方法进行比较。
                  if ((persons1 as IStructuralEquatable).Equals(
                persons2, EqualityComparer<Person>.Default))
       单步调试上面这行代码时,由于persons1和persons2共有三个元素
       所以比较函数会进行三次(注意:会被执行三次),由于两个数组中第三个元素的FirstName
       不相同,所以返回内容不相同的结果
      
       注意:如果两个数组的元素个数不相等,则直接返回不相等,不会调用Person类的Equals比较方法

 

原创粉丝点击