如何高效的比较两个 Object 对象是否相等?

咨询区

  • DmitryBoyko

我有两个复杂的对象 Object1Object2,这两个对象大概有 5 层的深度。

我现在需要一个快速的方法比较两个对象是否相等,请问我该如何实现?

回答区

  • vivek nuna

如果你的class是一个不可变的,比如说它下面的属性是那种一创建之后就不会再变更的情况,同时又是 C#9 的话,我建议你使用一个叫 record 的新特性,参考如下代码:

public record Person
{public string LastName { get; }public string FirstName { get; }public Person(string first, string last) => (FirstName, LastName) = (first, last);
}var person1 = new Person("Bill", "Wagner");
var person2 = new Person("Bill", "Wagner");Console.WriteLine(person1 == person2); // true
  • Arvo Bowen

可以通过序列化的方式来比较两个 object 是否相等,如果要这么做的话,可以使用扩展方法来实现,参考如下代码:

using System.IO;
using System.Xml.Serialization;static class ObjectHelpers
{public static string SerializeObject<T>(this T toSerialize){XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());using (StringWriter textWriter = new StringWriter()){xmlSerializer.Serialize(textWriter, toSerialize);return textWriter.ToString();}}public static bool EqualTo(this object obj, object toCompare){if (obj.SerializeObject() == toCompare.SerializeObject())return true;elsereturn false;}public static bool IsBlank<T>(this T obj) where T: new(){T blank = new T();T newObj = ((T)obj);if (newObj.SerializeObject() == blank.SerializeObject())return true;elsereturn false;}}

然后像下面这样使用。

if (record.IsBlank())throw new Exception("Record found is blank.");if (record.EqualTo(new record()))throw new Exception("Record found is blank.");
  • goric

可以通过反射对类中的所有属性进行比较,参考如下代码:

static bool Compare<T>(T Object1, T object2){//Get the type of the objectType type = typeof(T);//return false if any of the object is falseif (object.Equals(Object1, default(T)) || object.Equals(object2, default(T)))return false;//Loop through each properties inside class and get values for the property from both the objects and compareforeach (System.Reflection.PropertyInfo property in type.GetProperties()){if (property.Name != "ExtensionData"){string Object1Value = string.Empty;string Object2Value = string.Empty;if (type.GetProperty(property.Name).GetValue(Object1, null) != null)Object1Value = type.GetProperty(property.Name).GetValue(Object1, null).ToString();if (type.GetProperty(property.Name).GetValue(object2, null) != null)Object2Value = type.GetProperty(property.Name).GetValue(object2, null).ToString();if (Object1Value.Trim() != Object2Value.Trim()){return false;}}}return true;}

点评区

在现实项目开发中,很多时候你无法对 class 进行操控,比如说,不能给它实现个什么 IEquatable<T> 接口,也不能重写它的 Equals()Override() 方法,所以说用 序列化 的方式进行比较还是比较简单粗暴的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站架构系列:电商网站架构案例

为什么80%的码农都做不了架构师&#xff1f;>>> #0 系列目录# 大型分布式网站架构大型分布式网站架构技术总结大型网站架构系列&#xff1a;电商网站架构案例#1 电商案例原因# 分布式大型网站&#xff0c;目前看主要有几类1.大型门户&#xff0c;比如网易&#xff…

八、结构模式之组合(Composite)模式

组合模式属于对象的结构模式&#xff0c;有时又叫做部分-整体模式&#xff0c;组合模式将对象组织到树结构中&#xff0c;可以用来描述整体与部分的联系。其可以使客户端将单纯元素和组合元素同等对待。 当需求中是体现部分与整体层次的结构时&#xff0c;以及你希望用户可以忽…

代言男科、站台微商、变身神棍....这些科学家被捧了几十年,黑历史曝光后,让人三观尽毁......

全世界只有3.14 % 的人关注了爆炸吧知识说到诺贝尔奖得主&#xff0c;尤其科学类奖项&#xff0c;吃瓜群众的感受常常是:不明觉厉。关于他们有多牛x的故事&#xff0c;你肯定听了不少。但你一定很少听过&#xff0c;诺奖得主转而研究伪科学&#xff0c;或者为了恰饭疯狂掉节操的…

Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法

如果你不是开发者&#xff1a;如果你在android上更新一个已经安装过较早版本软件时&#xff0c;安装到最后一步提示你&#xff1a;已安装了存在签名冲突的同名数据包&#xff0c;然后安装失败。这是因为旧版软件的签名信息与新版不一致造成的。你可以卸载这个软件&#xff0c;然…

bmp文件c语言程序解读,bmp文件头_C语言解析BMP文件的结构

摘要 腾兴网为您分享:C语言解析BMP文件的结构&#xff0c;周公解梦&#xff0c;小睡眠&#xff0c;完美志愿&#xff0c;琦书屋等软件知识&#xff0c;以及今日头条&#xff0c;广告点击软件&#xff0c;迅雷资源搜索引擎&#xff0c;东兴证券软件&#xff0c;一键盘锁屏&#…

使用Outlook 2007连接到Exchange Server 2003、2007时出现没有默认网关的错误

在使用Outlook 2007作为客户端连接到Exchange Server 2003/2007时&#xff0c;会出现一个错误提示&#xff1a;"到Microsoft Exchange的连接不可用。您的网络适配器没有默认网关。"解决方法&#xff1a;1. 单击“开始”&#xff0c;单击“运行”&#xff0c;在“打开…

C# WPF MVVM开发框架Caliburn.Micro入门介绍①

01—Caliburn.Micro简介Caliburn.Micro是一套基于XAML的MVVM模式的开发框架&#xff0c;它小巧而强大。在CaliburnMicro中只需要按照约定把View的名字加上后缀ViewModel&#xff0c;就是它的View Model 的名字&#xff0c;如:MainPage和 MainPageViewModel。Caliburn.Micro自动…

深度分析 Java 的 ClassLoader 机制(源码级别)(转)

写在前面&#xff1a;Java中的所有类&#xff0c;必须被装载到jvm中才能运行&#xff0c;这个装载工作是由jvm中的类装载器完成的&#xff0c;类装载器所做的工作实质是把类文件从硬盘读取到内存中&#xff0c;JVM在加载类的时候&#xff0c;都是通过ClassLoader的loadClass&am…

Struts2和Struts1的不同

转载&#xff08;没看懂&#xff09; Action 类 ◆Struts1要求Action类继承一个抽象基类org.apache.struts.action.Action。Struts1的一个普遍问题是使用抽象类编程而不是接口。 ◆Struts 2 Action类可以实现一个Action接口&#xff0c;也可实现其他接口&#xff0c;使可选和定…

拉屎能赚钱?在马桶上月入过万?原来卫生间里还有这么多隐藏福利,超模君都惊了……

全世界只有3.14 % 的人关注了爆炸吧知识模友们&#xff0c;你们有过“带薪拉屎”的经历吗&#xff1f;没错&#xff0c;假如我们每天花10分钟“带薪拉屎”&#xff0c;那一年大概能积攒下来40小时&#xff0c;假如我们每天工作8小时&#xff0c;等于多了5天年假&#xff0c;白嫖…

Android之让图片匀速旋转效果

图片匀速旋转 当我们更新的时候,需要把更新小图标旋转起来,不废话,先爆照 介绍动画: Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先…

C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?

我定义a^bab(10a b)^2 100a^2 20ab b^2 100a^2 b(20a b)a代表已经计算结b代表前需要计算位数每计算程100a^2都减掉剩b(20a b)需要做找整数b使b(20a b)>b,(10*a b)^n-(10*a)^n≈n*(10*a)^(n-1)*b,即:b≈41221398234/n/(10*a)^(n-1)41221398234/5/180^4≈7。85,取b7各步都更…

百度语言翻译机

百度语言翻译机 2006 年百度之星程序设计大赛初赛题目 6 百度语言翻译机 时限 1s 百度的工程师们是非常注重效率的&#xff0c;在长期的开发与测试过程中&#xff0c;他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈&#xff0c;会议&#xff0c;甚至在各中技术文档中都…

Android之如何使用快速联系徽章

翻译地址:http://code.tutsplus.com/tutorials/android-quick-tip-using-the-quick-contact-badge--mobile-2245 如果你花任何时间在一个Android设备,您可能已经注意到你可以点击小图片联系如何启动一个工具栏与很多不同的行为,如电话、短信、邮件的人。 在这个快速提示,您…

dotnet 使用 Infer# 自动分析代码缺陷

本文告诉大家如何使用 Infer# 开源库配合 GitHub 的 Action 实现自动分析代码缺陷&#xff0c;如找到可空引用或线程安全等问题这是一个在 GitHub 上完全开源的仓库&#xff0c;请看 https://github.com/microsoft/infersharp刚好今天收到了 Infer# 发布 1.2 版本博客&#xff…

发了篇paper,双非二本的她直博浙大

全世界只有3.14 % 的人关注了爆炸吧知识大家好&#xff0c;我是小南&#xff0c;本科就读于国内某双非二本院校&#xff0c;于2019年拿到了浙江大学的直博录取函。很多人问我从二本院校成功跨越到国内知名高校的秘诀是什么&#xff0c;我个人觉得&#xff0c;除开运气&#xff…

FZU 2095 水面高度

一共六种情况。手算即可。 #include<cstdio> #include<cstring> #include<cmath>int T; double a,b,c,d,x; double ans;int main() {scanf("%d",&T);while(T--){scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&x);doubl…

android+清除循环动画,android - 如何使用ViewPropertyAnimator生成循环动画?

我想构建一个TextViews动画&#xff0c;在完成后会自动重复。对于我要设置动画的每个View&#xff0c;我使用以下代码final float oldX v.getX();final float newX v.getX() - (float)totalWidth;final AnimatorListenerAdapter listener new AnimatorListenerAdapter() {Ov…

(转)matlab各类数学公式

matlab矩阵应用clear%建立矩阵的两种方式A1 [1 2 3 4 5; 6 7 8 9 10];A2 [ 1 2 3 4 5 6 7 8 9 10 ];%一种是换行用引号&#xff0c;一种是自然写法 clearA [5 4 3 2 1; 6 7 8 9 10;1 2 3 4 5;24 24 24 24 24;25 25 25 25 25];B [5 4 3 2 1; 6 7 8 9 10;…

PS网页设计教程XVI——在PS中创建一个摩登实验室风格的网页设计

作为编码者&#xff0c;美工基础是偏弱的。我们可以参考一些成熟的网页PS教程&#xff0c;提高自身的设计能力。套用一句话&#xff0c;“熟读唐诗三百首&#xff0c;不会作诗也会吟”。 本系列的教程来源于网上的PS教程&#xff0c;都是国外的&#xff0c;全英文的。本人尝试翻…