C#比较

初学C#,此文章意在记录学习心得

C#是如何比较的,首先看如下程序,p1和p2是两个不同的引用,所以第一次比较输出no same。

p1和p3引用同一段内存空间,所以第二次比较输出same。

    class Program
    {
        static void Main(string[] args)
        {
            person p1 = new person { name = "SLH" };
            person p2 = new person { name = "SLH" };
            person p3 = p1;
            if (p1 == p2)
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");
            Console.WriteLine("!-********************-!");
            if (p1 == p3)
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");
            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
    }

第二段程序使用Equals进行比较,结果相同

class Program
    {
        static void Main(string[] args)
        {
            person p1 = new person { name = "SLH" };
            person p2 = new person { name = "SLH" };
            if (p1 .Equals (p2 ))
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");
            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
    }

第三段程序我们在person类中重写了Equals()方法,通过person类型的name属性来比较两个person对象是否相同,结果输出same

class Program
    {
        static void Main(string[] args)
        {
            person p1 = new person { name = "SLH" };
            person p2 = new person { name = "SLH" };
            if (p1 .Equals (p2 ))
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");
            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
       
public override bool Equals(object obj)
        {
            return this.name .Equals(((person )obj).name );
        }

    }

那么我们如何比较person类型的数组呢,看下面程序,执行结果no same

class Program
    {
        static void Main(string[] args)
        {
            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                               };
            person[] persons2 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                               };
            if (persons1 != persons2)
                Console.WriteLine("no same");
            else
                Console.WriteLine("same");

            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
        public override bool Equals(object obj)
        {
            return this.name.Equals(((person)obj).name);
        }
    }

c#数组显式实现了IStructuralEquatable接口,使用时需要把数组强制转换为该接口,这个接口用于比较两个数组是否内容相同,例程如下。

IStructuralEquatable接口定义了Equals()方法,方法需传入两个参数,第一个参数为另一个数组,object类型,

第二个参数为IEqualityComparer类型,可以通过EqualityComparer<T>类型的Default属性返回IEqualityComparer接口的一个默认实现,就可以定义如何进行比较了

当然person类中还需重写Equals()方法,程序执行结果为same

使用IStructuralEquatable接口需引用System.Collections命名空间

 

class Program
    {
        static void Main(string[] args)
        {
            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                               };
            person[] persons2 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                               };
   
        if (((IStructuralEquatable)persons1).Equals(persons2, EqualityComparer<person>.Default))
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");

            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
        public override bool Equals(object obj)
        {
            return this.name.Equals(((person)obj).name);
        }
    }

此时修改persons2数组,程序运行结果为no same

            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}                              
                               };
            person[] persons2 ={
                                   new person (){name ="Tom"},
                                   new person (){name ="Jackson"}
                               };

修改persons2数组,程序运行结果no same

            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                                   
                               };
            person[] persons2 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"},
                                   new person (){name ="SLH"}
                               };

修改persons2数组,程序运行结果no same

            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                                   
                               };
            person[] persons2 ={
                                   new person (){name ="Jackson"},
                                   new person (){name ="SLH"}
                                   
                               };


由Default属性返回的IEqualityComparer接口的默认实现,首先检查person类型是否实现了IEquatable <T>接口,如果实现了,就调用IEquatable.Equals()方法,

如果没有实现,就调用Object.Equals()方法,看下面程序A与程序B

程序A,运行结果

IEquatable
no same

class Program
    {
        static void Main(string[] args)
        {
            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}          
                               };
            person[] persons2 ={
                                   new person (){name ="Jackson"},
                                   new person (){name ="SLH"}                                 
                               };
            if (((IStructuralEquatable)persons1).Equals(persons2, EqualityComparer<person>.Default))
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");

            Console.ReadLine();
        }
    }
    class person
:IEquatable <person >
    {
        public string name;
        public override bool Equals(object obj)
        {
            Console.WriteLine("Equals");
            return this.name.Equals(((person)obj).name);
        }

        public bool Equals(person other)
        {
            Console.WriteLine("IEquatable");
            return this.name.Equals(other.name);
        }

    }

程序B运行结果

Equals
no same

 

 class Program
    {
        static void Main(string[] args)
        {
            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                                   
                               };
            person[] persons2 ={
                                   new person (){name ="Jackson"},
                                   new person (){name ="SLH"}
                                   
                               };
            if (((IStructuralEquatable)persons1).Equals(persons2, EqualityComparer<person>.Default))
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");

            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
        public override bool Equals(object obj)
        {
            Console.WriteLine("Equals");
            return this.name.Equals(((person)obj).name);
        }
    }

当然我们也可以不使用EqualityComparer<T>类型的Default属性返回的默认实现,如下程序定义了equalityComparer类,实现了IEqualityComparer接口

class Program
    {
        static void Main(string[] args)
        {
            person[] persons1 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                                   
                               };
            person[] persons2 ={
                                   new person (){name ="SLH"},
                                   new person (){name ="Jackson"}
                                   
                               };
            if (((IStructuralEquatable)persons1).Equals(persons2,
new equalityComparer () ))     //此处第二个参数传入equalityComparer类的匿名对象
                Console.WriteLine("same");
            else
                Console.WriteLine("no same");

            Console.ReadLine();
        }
    }
    class person
    {
        public string name;
        public override bool Equals(object obj)
        {
            Console.WriteLine("Equals-person");
            return this.name.Equals(((person)obj).name);
        }
    }
   
class equalityComparer :IEqualityComparer
    {

        public new bool Equals(object x, object y)     //执行if判断时,调用equalityComparer类的Equals()方法,此时传入的两个参数为person类型对象,调用person类型的Equals()方法

                                                                               //因为数组包含两个元素,所以会调用两次
        {
            Console.WriteLine("Equals-equalityComparer");
            return x.Equals(y);
        }

        public int GetHashCode(object obj)
        {
            return obj.GetHashCode();
        }
    }

程序运行结果:

Equals-equalityComparer
Equals-person
Equals-equalityComparer
Equals-person
same

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值