C#编程(三十七)----------结构比较

结构比较

数组和元组都实现接口IStructuralEquatable和IStructuralComparable.这两个接口不仅可以比较引用,还可以比较内容.这些接口都是显示实现的,所以在使用时需要把数组和元组强制转换为这个接口.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

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

//因为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()方法,用来比较FirstName和LastName属性的值.

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

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

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

//因为t1和t2引用了两个不同的对象,所以比较运算符"!="返回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接口定义,并把object和IequalityComparer作为参数.

还可以使用类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方法为要比较的每一项调用TupleComparer的Equals()方法.所以,对于Tuple<T1,T2>类,要调用两次TupleCOmparer,以检查所有项是否相等.

时间: 2024-12-28 08:04:21

C#编程(三十七)----------结构比较的相关文章

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

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

centos shell编程3【告警系统】 第三十七节课

centos shell编程3[告警系统]  第三十七节课 上半节课 下半节课 整个项目没有任何架构,都是单机的,没有服务器端和客户端的概念只是简单调用一下shell脚本,子shell,通过添加更多的shell脚本扩展功能 mail.sh:做邮件收敛uptime或w 获取load average 需要安装php环境yum install -y php 需求: 使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日

ActionScript3游戏中的图像编程(连载三十七)

2.2.10 内阴影选项 最后检查一下有没有漏网之鱼--嗯,Flash里还有个"内阴影"被我们忽略了,勾选以后,投影将形成于在文字内部(为了让阴影效果看得清楚点,我暂时把文本调整为绿色#00CC00)(图 2.40). 图 2.40 Flash的内阴影 内阴影在Photoshop里作为一个独立的选项存在于图层样式的列表中,参数与投影选项基本一致,只是少了"挖空"复选框.(图 2.41) 图 2.41 Photoshop的内阴影选项 两个选项都勾上以后,内外阴影就会同

[原创]ActionScript3游戏中的图像编程(连载三十七)

2.2.10 内阴影选项 最后检查一下有没有漏网之鱼……嗯,Flash里还有个“内阴影”被我们忽略了,勾选以后,投影将形成于在文字内部(为了让阴影效果看得清楚点,我暂时把文本调整为绿色#00CC00)(图 2.40). 图 2.40 Flash的内阴影 内阴影在Photoshop里作为一个独立的选项存在于图层样式的列表中,参数与投影选项基本一致,只是少了“挖空”复选框.(图 2.41) 图 2.41 Photoshop的内阴影选项 两个选项都勾上以后,内外阴影就会同时应用于同一个对象上了,但是F

NeHe OpenGL教程 第三十七课:卡通映射

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十七课:卡通映射 卡通映射: 什么是卡通了,一个轮廓加上少量的几种颜色.使用一维纹理映射,你也可以实现这种效果. 看到人们仍然e-mail我请求在文章中使用我方才在GameDev.net上写的源代码,还看到文章的第二版(在那每一

第三十七章

道恒无为,侯王若能守之,万物将自化.化而欲作,吾将镇之以无名之朴.镇之以无名之朴,夫亦将不欲.不欲以静,万物将自定. 第三十七章1 你抱着怎样的心态,世界就怎样回馈你 道恒无为,侯王若能守之,万物将自化. (第三十七章 第1讲) 道”一直是无我利他(即无为)的,领导者如果能按照天之道做事,做到圣人之道,万物会自动跟着你改变,被你感化. 效仿天之道是解开<道德经>秘密的核心.你是什么心态,世界就怎么回馈你,世界会呼应你的心态. 各位朋友大家好,今天我们接着来聊<道德经>. 在讲之前先

实验三 分支结构程序设计

实验三  分支结构程序设计 班级:物流191                        姓名:梁晓芹                   学号:3190505138 指导老师:修宇                       成绩:                         日期:2020年3月4日       [实验目的]   (1)掌握分支结构要点: (2)熟悉分支结构程序中语句的执行过程: (3)掌握分支结构程序的设计方法. [实验条件]   PC机或者远程编程环境 [实验理论与

ILGenerator.Emit动态 MSIL编程(三)之动态代理

using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; public sealed class DynamicProxy { private static readonly string AssemblyName = "DynamicProxy", ModuleName = "DynamicProxy", TypeName = "Dyna

编程题:结构体数组的引用。功能:输出结构体数组各元素的成员值

编程题:结构体数组的引用.功能:输出结构体数组各元素的成员值 #include<stdio.h> void main() { struct person { char name[20]; char sex; int age; float height; }per[3]={{"Li Ping",'M',20,175},{"Wang Ling",'F',19,162.5}, {"Zhao Hui",'M',20,178}}; int i;

第三百三十七节,web爬虫讲解2—PhantomJS虚拟浏览器+

第三百三十七节,web爬虫讲解2-PhantomJS虚拟浏览器+selenium模块操作PhantomJS PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,利用这个软件,可以获取到网址js加载的任何信息,也就是可以获取浏览器异步加载的信息 下载网址:http://phantomjs.org/download.html  下载对应系统版本 下载后解压PhantomJS文件,将解压文件夹,剪切到python安装文件夹 然后将P