介绍

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

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

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

安装

nuget搜索ObjectsComparer

使用

首先我们定义一个简单类

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属性的值不一样

那我们再试试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);

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

应用场景

像做过.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环境!

C#使用Objects Comparer进行对象比较相关推荐

  1. Windows APO(Audio Processing Objects, 音频处理对象)

    "Windows音频驱动"翻译系列总目录: https://blog.csdn.net/danteLiujie/article/details/102530417 原文时间是:20 ...

  2. java isnull()_java.util.Objects.isNull vs对象== nu

    在if语句中,是否应该出于任何原因/情况在Objects.isNull()上使用object == null? 是的,原因之一是使代码保持简单. if语句Objects.isNull(object)中 ...

  3. Reference counted Objects (引用计数对象) - 文章翻译

    原文地址:http://netty.io/wiki/reference-counted-objects.html 从Netty4开始,某些对象的饿生命周期由其引用计数来管理,因此,一旦不再使用,Net ...

  4. Lab: Modifying serialized objects 修改序列化对象

    https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-modifying-serial ...

  5. Classes and Objects in Java--类和对象

    In this session, we will discuss classes and objects and learn how to create them in Java. 本章节我们学习类和 ...

  6. BDB 入门篇 第5章 Saving and Retrieving Objects 保存和检索对象

    第5章 Saving and Retrieving Objects 保存和检索对象 要将对象存储在EntityStore中,您必须对类进行相应的注解,然后将其存储 PrimaryIndex.put() ...

  7. 学习《Building Applications with FME Objects》 之二 使用Sessions(会话)

    使用FME Objects的起点是创建一个FME Object session(会话)对象FMEOSession,除非你的应用程序要操作有限的虚拟内存,当你的应用程序初始化市可以简单的创建FMEOSe ...

  8. 如何遍历JavaScript对象?

    本文翻译自:How to iterate over a JavaScript object? I have an object in JavaScript: 我在JavaScript中有一个对象: { ...

  9. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

最新文章

  1. android 蓝牙通讯编程 备忘
  2. 加载dict_PyTorch 7.保存和加载pytorch模型的两种方法
  3. java 常见数据类型
  4. 将所有文件从目录复制到Python中的另一个目录
  5. 作者:杨青海(1965-),男,博士,中国标准化研究院高级工程师。
  6. 【云服务】浅析XaaS
  7. mysql连接多个存储存储_Mysql(三):多表查询和存储程序
  8. php 单一职责,单一职责原则
  9. oracle 主键自增函数_Oracle数据库中创建自增主键的实例教程
  10. linux 更新软件源
  11. CSS文件未加载浏览器报警告:Resource interpreted as Stylesheet but transferred with MIME type text/html...
  12. Hibernate_01_初体验
  13. stata面板数据gmm回归_12短动态面板数据模型1-差分GMM估计-Stata软件操作教程
  14. Java虚拟机的类加载机制
  15. 【论文写作技巧】Endnote参考文献统一输出格式
  16. 前端页面 div+css内容太长,实现点击展开余下全文(修改版)
  17. GB2312编码规则与代码实现
  18. iOS视频开发(二):视频H264硬编码
  19. 蓝桥杯真题系列:第十一届蓝桥杯C语言B组集锦
  20. 使用deno和oak创建短链应用 1.0

热门文章

  1. 谈谈一些有趣的CSS题目(十六)-- 奇妙的 background-clip: text
  2. GDI与OpenGL与DirectX之间的区别
  3. cdoj 1131 男神的礼物 区间dp
  4. Ubuntu14.04LST安装weblogic11g
  5. MSFT Outlook VBA处理新邮件的方法
  6. virtualenv模块使用
  7. HDFS文件目录操作代码
  8. 3 Python os 文件和目录
  9. Spring中神奇@aotuWrited
  10. C++中数字和字符的转换