C#高级编程三十七天----结构比较

原创 2015年07月06日 20:36:08

结构比较

数组和元组都实现接口IStructuralEquatableIStructuralComparable.这两个接口不仅可以比较引用,还可以比较内容.这些接口都是显示实现的,所以在使用时需要把数组和元组强制转换为这个接口.IStructuralEquatable接口用于比较两个元组或数组是否有相同的内容,IStructuralComparable接口用于给元组或数组排序.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace 结构比较

{

    class Program

    {

        static void Main(string[] args)

        {

           //创建两个Person项的数组.

            //比较运算符!=返回true

            //因为这其实是两个变量p1p2引用的两个不同数组.

            //因为array类没有重写带一个参数的Equals()放大,所以用"=="运算符

            //比较引用会得到相同的结构,即这两个变量不相同

            Person zhangsan = new Person { FirstName = "zhang", LastName = "san" };

            Person[] p1 = {

                              new Person

                                {

                                    FirstName="lisi"

                                } ,

            zhangsan

                          };

            Person[] p2 = {

                              new Person

                                {

                                    FirstName="lisi"

                                } ,

            zhangsan

                          };

            if (p1!=p2)

            {

                Console.WriteLine("not the same reference"); ;

            }

            Console.ReadKey();

        }

    }

    public class Person : IEquatable<Person>

    {

        public int ID { get; set; }

        public string FirstName { set; get; }

        public string LastName { set; get; }

 

        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 override int GetHashCode()

        {

            return ID.GetHashCode();

        }

        public bool Equals(Person other)

        {

            if (other == null)

            {

                throw new ArgumentNullException("other");

            }

            return this.ID == other.ID && this.FirstName == other.FirstName && this.LastName == other.LastName;

        }

    }

}

 

使用实现IEquatable接口的Person.IEquatable接口定义了一个强类型化的Equals()方法,用来比较FirstNameLastName属性的值.

 

下面看看如何对元组执行相同的操作.这里创建了两个内容相同的元组实例:

 var t1 = Tuple.Create<string, int>("zhangsan", 19);

            var t2 = Tuple.Create<string, int>("zhangsan", 19);

            //因为t1t2引用了两个不同的对象,所以比较运算符"!="返回true

            if (t1 != t2)

            {

                Console.WriteLine("not the same reference to the tuple");

            }

            //这会调用object.equals()方法比较元组的每一项,每一项都返回true

            if (t1.Equals(t2))

            {

                Console.WriteLine("the same reference to the tuple");

            }

Tuple<>类提供了两个Equals()方法:一个重写了object基类中的Equals()方法,并把object作为参数,第二个由IStructyralEqualityComparer接口定义,并把objectIequalityComparer作为参数.

 

还可以使用类TupleCOmparer创建一个自定义的UequalityComparer,这个类实现了IEqualityComparer接口的两个方法Equals()GetHashCode():

 public class TupleComparer : IEqualityComparer

    {

        public bool Equals(object x, object y)

        {

            return x.Equals(y);

        }

 

        public int GetHashCode(object obj)

        {

            return obj.GetHashCode();

        }

}

实现IEqualityCOmparer接口的Equals()方法需要new修饰符或者隐式实现的接口,因为基类object也定义了带两个参数的静态的Equals()方法.

 

使用TupleComparer,Tuple<T1,T2>类的Equals()方法传递一个新实例.Tuple类的Equals(0方法为要比较的每一项调用TupleComparerEquals()方法.所以,对于Tuple<T1,T2>,要调用两次TupleCOmparer,以检查所有项是否相等.

读书笔记:《C#并行编程高级教程》-第五章:协调数据结构

《C#并行编程高级教程》-第五章:协调数据结构 本周

pp看书笔记---C#高级编程第九版 第三章 【类和结构】

前言 这一章主要是叙述类,类的结构,即组成,类中有成员变量,有成员函数,(构造器等不论); 成员变量有字段和属性;他们的修饰符区别; 有构造函数和参数 类总结完和结构比较 这是这一篇文章的线路,这一章...

读《C#高级编程》第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但 是做事情很能坚持。 本章主要是了解.Net的结构,都是一些概念,并没有可

读《C#高级编程》第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但 是做事情很能坚持。   本章主要是了解.Net的结构,都是一些概念,并没有可...

1_C# 高级编程(第六版)学习笔记——第1章 .Net 体系结构

声明: 本博客为原创博客,主要讲述学习C# 高级编程(第六版)中的jishu,转载请声明出处。如有技术问题或需交流可直接联系本人邮箱:chuiwenwei@163.com...

C#高级编程笔记之.NET体系结构

 .NET Framework的核心是CLR,在CLR控制下的代码称为托管代码。1. 在.NET中编译分为两个阶段:(1) 把源代码编译为IL.   (2) CLR把IL编译为平台专用代码.2. 托管...

C#高级编程(第8版)---NET体系结构

1.1  C#与.NET的关系 整本书都将强调,C#语言不能孤立地使用,而必须和.NET Framework一起考虑。C#编译器专门用于.NET,这表示用C#编写的所有代码总是在.NET Frame...

C#高级编程十八天----C#中的结构

C#中的结构 假设有一个类: class Dimensions { public double Length; public double Width; } 定义了一个类,它只存储某一项...

C#高级编程之体系结构

  • 2010年03月05日 14:33
  • 87KB
  • 下载

C# 高级编程 对象和类型

类  和 结构 都是创建对象的模板, 都可以用 new 类实例化 结构是值类型,存储在栈上, 类是引用类型  存储在堆上  类可以包含数据成员,函数成员 和 类成员 数据成员: 字段,常量 和...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#高级编程三十七天----结构比较
举报原因:
原因补充:

(最多只允许输入30个字)