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比较方法
- C#数组比较(IStructuralEquatable接口)
- C#两个数组比较
- C#比较接口和排序
- C#抽象类与接口的比较
- C#抽象类与接口的比较
- C#抽象类和接口的比较
- C#抽象类与接口的比较
- C#接口与抽象类的比较
- C#比较器接口IComparer的实现
- Java与C#二维数组比较
- C#中各种数组的性能比较
- C++和C#中数组的比较
- C#中索引跟数组的比较
- C# byte字节数组比较方法分析
- C#中如何比较二进制数组
- C#比较两个数组的不同
- c#中多维数组技术性能比较
- c#比较两个数组的差异
- 自动执行 Office 应用程序时收到运行时错误 429
- hibernate中的 bag--解释的太好了.
- Word在固定位置插入递增数字
- 互联网创业公司常见失败原因是什么?
- linphone快速挂断后的程序崩溃问题
- C#数组比较(IStructuralEquatable接口)
- 多线程
- libpcapz实例
- Linux下Socket编程中用send发送结构体
- ubuntu12.04安装Eclipse Indigo
- Window.open 打开的窗口标题中包含url
- 过程式编程-绘图程序
- asp.net 抓取网页 自动识别编码
- Web应用中的轻量级消息队列