C#使用Objects Comparer进行对象比较

介绍

Objects Comparer是用于对象比较的工具,c#常见的数据结构都是可以用这个三方库进行对比,比较复杂的对象也是可以比较的。

简而言之,Objects Comparer 是一个对象到对象的比较器,

它允许逐个成员递归得比较对象,并为某些属性、字段或类型定义自定义比较规则。

安装

nuget搜索ObjectsComparer

e84e37955a547fe3fe8fd6316f8e0321.png

使用

首先我们定义一个简单类

public class UserInfomation {public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }}

然后实例化两个UserInfomation对象并赋不同的值

然后我们实例化 ObjectsComparer.Comparer比较器

var comparer1 = new ObjectsComparer.Comparer<UserInfomation>();

然后我们将实例化的两个对象传入到 ObjectsComparer.Comparer 方法中

IEnumerable<Difference> differences1;var isEqual1 = comparer1.Compare(userInfomationOld, userInfomationNew, out differences1);

然后通过返回值判断对象是否一致,如果不一致可以通过differences1获取到不一致的值

查看输出 能够知道实例化的两个对象是age属性的值不一样

45ef28cdf1d418f003893fdbe5f3983a.png

那我们再试试List<T>类型的   

List<UserInfomation> lstUserInfomationsOld=new List<UserInfomation>();for (int i = 0; i < 3; i++){UserInfomation user=new UserInfomation();user.Name = "张三";user.Age = 30;user.Sex = "男";lstUserInfomationsOld.Add(user);}List<UserInfomation> lstUserInfomationsNew = new List<UserInfomation>();for (int i = 0; i < 2; i++){UserInfomation user = new UserInfomation();user.Name = "李四";user.Age = 30;user.Sex = "男";lstUserInfomationsNew.Add(user);}var comparer = new ObjectsComparer.Comparer<List<UserInfomation>>();IEnumerable<Difference> differences;var isEqual = comparer.Compare(lstUserInfomationsNew, lstUserInfomationsOld, out differences);string differencesMsg = string.Join(Environment.NewLine, differences);Console.WriteLine(differencesMsg);

查看输出能够看出是数量不一致的问题

cc62cf306ba51dd778d20aed56d081d8.png

应用场景

像做过.net客户端开发的人都知道,我们在维护一些基础数据的时候都避免不了要编辑数据!

有的时候我们打开编辑页面,实际未修改数据,再去点击保存按钮要不一个一个字段去对比有没有修改数据

要不就直接暴力处理, 不校验有没有修改数据,直接调用update接口

那么我们的Objects Comparer就派上用场了 

我们首先封装一个BaseForm

然后在基类控件中 封装一个比较方法

protected Result ComPare<T>(T t, T s){Result result =new Result();var comparer = new ObjectsComparer.Comparer<T>();IEnumerable<Difference> differences;bool isEqual = comparer.Compare(t, s, out differences);result.IsEqual = isEqual;if (!isEqual){  string differencesMsg = string.Join(Environment.NewLine, differences);result.Msg=differencesMsg;}return result;}public class Result{ public bool IsEqual { get; set; }public string Msg { get; set; }

 我们在打开编辑页面的时候会加载当前页面的数据

这时候 我们可以获取到未编辑之前的数据将它设置为全局变量

然后保存的时候我们可以获取到编辑之后的对象

这时候我们再去调用基类的比较方法

获取两个对象之间值是否有改变,如果没有改变,我们就给出"数据未修改,请问是否关闭窗体“等提示

public partial class MainFrm : BaseForm{Test _testOld;public MainFrm(){InitializeComponent();_testOld = LoadData();txtName.Text= _testOld.Name;txtAge.Text = _testOld.Age.ToString();txtSex.Text = _testOld.Sex;}private Test LoadData(){Test test = new Test();test.Name = "张三";test.Age = 30;test.Sex = "男";return test;}private void uiButton1_Click(object sender, EventArgs e){Test test=new Test();test.Name =txtName.Text;test.Age =int.Parse( txtAge.Text);test.Sex=txtSex.Text;Result result=  ComPare(_testOld, test);if (result.IsEqual){MessageBox.Show("数据未修改");return;}//然后再写保存逻辑MessageBox.Show("保存成功");}}public class Test{public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }}

当然还有很多应用场景,我只是分享我常使用的场景罢了。

最后希望各位neter分享更多有用的工具,共同改善net环境!

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

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

相关文章

jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作

var nodeHook, boolHook,rclass /[\t\r\n\f]/g,rreturn /\r/g,rfocusable /^(?:input|select|textarea|button)$/i;jQuery.fn.extend({attr: function( name, value ) { //遍历this //arguments.length > 1,jQuery.attr(this[i],name,value),返回this //arguments.lengt…

Eclipse提示The **** cannot be resolved. It is indirectly referenced from required .cl

1、问题 代码正常&#xff0c;提示这个错误The **** cannot be resolved. It is indirectly referenced from required .cl 2、解决办法 把提示错误地方的类改成在这个****包名下面就行

ora22813操作数值超出系统的限制_最新:华为“鸿蒙”操作系统终于面世!一旦遭到限制,将随时启用...

受美国的要求&#xff0c;自5月开始&#xff0c;安卓暂停了与华为的部分合作&#xff0c;而这直接影响到了华为对安卓系统的正常更新。迫于无奈之下&#xff0c;华为对外表示&#xff0c;已经准备了备用系统&#xff0c;但只在必要的情况下使用&#xff0c;而这一系统就是广为人…

解决点击MDI父窗体下拉菜单,子窗体重复出现的问题

private void 培训信息TToolStripMenuItem_Click(object sender, EventArgs e) { foreach (Form form in Application.OpenForms) { if (form.Name "Zhuce_Train")//子窗体的Name属性 { …

cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法

问题描写叙述: 这段时间机器总是出现一个奇怪的问题:cidaemon.exe进程占用CUP率98%以上,大大影响了电脑的正常使用.资源管理器中出现多个cidaemon.exe进程,强制结束占用cpu率最高的一个,两分钟左右后,相同的问题还是出现了。 问题关联: cidaemon.exe相关知识&#xff1a;cidaem…

Blazor University (2)布局 — 创建 Blazor 布局

原文链接&#xff1a;https://blazor-university.com/layouts/布局Blazor 布局类似于 ASP Webforms 母版页的概念&#xff0c;与 ASP MVC 中的 Razor 布局相同。几乎网络上的每个网站都有一个模板用于整个网站&#xff08;页面顶部的品牌&#xff0c;底部的版权&#xff09;或网…

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一、plist文件和项目结构图 说明&#xff1a;这是一个嵌套模型的示例 二、代码示例&#xff1a; YYcarsgroup.h文件代码&#xff1a; 1 //2 // YYcarsgroup.h3 // 07-汽车展示&#xff08;高级&#xff09;4 //5 //…

递归和非递归实现规律函数

1、问题 A(n) n / (2 * n 1)B1 2 A1;B2 2 A1 * (2 A2);B3 2 A1 * (2 A2 * (2 A3));....以此类推&#xff0c;求B(n)2、代码实现 #include <stdio.h>/** A(n) n / (2 * n 1) B1 2 A1; B2 2 A1 * (2 A2); B3 2 A1 * (2 A2 * (2 A3)); ....以此类推&…

程序员永远的痛之字符编码的奥秘

字符编码相信是每个程序员的噩梦&#xff0c;只要是有中文的地方&#xff0c;总是会遇到各种编码的问题&#xff0c;并且这种问题还非常难缠&#xff0c;尤其在linux上&#xff0c;因为上面很多软件都是针对 英语国家开发的&#xff0c;是不会考虑其他语种编码问题。在遇到编码…

awb数据怎么计算_白平衡自己主动(AWB)算法---2,颜色计算

本文说明了白平衡算法估计当前场景的色温过程.色温计算的原理并不复杂,但要做到,还是一道&#xff0c;认真做好每一步,这需要大量的测试,和算法一直完好.关于该过程首先简要:1, 取的图像数据,并划分MxN块,如果是25x25,并统计每一块的基本信息(,白色像素的数量及R/G/B通道的分量…

svn强制要求提交注释

2019独角兽企业重金招聘Python工程师标准>>> 看了N多资料&#xff0c;不知道为什么我总是不成功。现在终于测试成功了&#xff0c;下面是实际操作过程~~ 使用bitnami一键安装了subversion&#xff0c;在使用中&#xff0c;希望开发人员提交时必须输入日志内容&#…

Xamarin效果第五篇之ScrollView动态滚动效果

前面基于Xamarin做了一点效果;这不过年从老家回来一直成沉迷工作无法自拔,没时间来更新文章了;今天赶紧抽点时间再来更新一下效果;直接看看最终实现的效果:前台RadioButton的事件绑定选中状态绑定:后台对ScrollView的滚动处理:ScrollView的滚动对当前选中状态的修改&#xff1a…

How to change the text color in the terminal

You can open the file ~/.bashrc and then choose the force_color_promptyes otherwise, you can change the color in PSI. 注意&#xff1a;使用方法&#xff1a;# PS1自定义内容注意两边的单引号示例&#xff1a; PS1(\u\H \d \t)\$-------------------------------------…

9 个使用前必须再三小心的 Linux 命令

Linux shell/terminal 命令非常强大即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下Linux 甚至不会询问你而直接执行命令导致你丢失各种数据信息。 一般来说在 Web 上推荐新的 Linux 用户执行这些命令当然也有人哪些写过这代码的人不这么想因为…

C/C++之内存对齐

1、什么是内存对齐 计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小 #include <stdio.h> struct A {char a;int b; };int main() {printf("size of struct A is %d\n", sizeo…

生存下去

这个世界就是这么的无情&#xff0c;你改不了现势&#xff0c;现势就会改变你&#xff0c;毫无疑问。加油吧&#xff0c;只为一个目的&#xff1a;生存下去。

池化层在全连接层之间吗,了解最大池化层之后的全连接层的尺寸

In the diagram (architecture) below, how was the (fully-connected) dense layer of 4096 units derived from last max-pool layer (on the right) of dimensions 256x13x13? Instead of 4096, shouldnt it be 256*13*1343264 ?解决方案If Im correct, youre asking why …

Blazor University (3)组件 — 创建组件

原文链接&#xff1a;https://blazor-university.com/components组件所有呈现的 Blazor 视图都来自 ComponentBase 类&#xff0c;这包括布局、页面和组件。Blazor 页面本质上是一个带有 page 指令的组件&#xff0c;该指令指定浏览器必须导航到的 URL 才能呈现它。事实上&…

View controller-based status bar

info.plist文件中&#xff0c;View controller-based status bar appearance项设为YES&#xff0c;则View controller对status bar的设置优先级高于application的设置。为NO则以application的设置为准&#xff0c;view controller的prefersStatusBarHidden方法无效&#xff0c;…

C和指针之IO总结

1、流 io操作就是简单的从程序移进或移出字节的事情,这种字节流便称为流 2、流的两种类型,文本流和二进制流 1)、文本流:文本流是指在流中流动的数据是以字符形式出现 2)、二进制流:二进制流是指流动的是二进制数字序列,若流只有字符,则用一个字节的二进制ASCII码表示…