1. /// <summary>
  2. /// 比较器帮助类
  3. /// 创建人:苏本东
  4. /// 创建时间:2019-11-5 11:52:29
  5. /// </summary>
  6. public class ComparerHelper<T> : IEqualityComparer<T>
  7. {
  8. private readonly Func<T, T, bool> _func;
  9.  
  10. /// <summary>
  11. /// 构造方法
  12. /// </summary>
  13. /// <param name="func"></param>
  14. public ComparerHelper(Func<T, T, bool> func)
  15. {
  16. this._func = func;
  17. }
  18.  
  19. /// <summary>
  20. /// 比较是否相等
  21. /// </summary>
  22. /// <param name="x"></param>
  23. /// <param name="y"></param>
  24. /// <returns></returns>
  25. public bool Equals(T x, T y)
  26. {
  27. return this._func(x, y);
  28. }
  29.  
  30. /// <summary>
  31. /// 返回哈希代码
  32. /// </summary>
  33. /// <param name="obj"></param>
  34. /// <returns></returns>
  35. public int GetHashCode(T obj)
  36. {
  37. //说明:此场景,不管obj的hashcode还是obj.id的hashcode都不会相同
  38. //而如果hashcode不相同,就不会走到equals方法
  39. //所以我们这里必须返回相同的hashcode,只有这样,equals方法才有机会被执行
  40. return 1;
  41. }
  42. }

比较的条件是一个匿名函数,通过构造方法传入。仔细看标红的文字。参考:https://www.cnblogs.com/mirageJ/p/8950842.html

随后又封装了一个类进行调用

  1. /// <summary>
  2. /// 检查excel数据是否重复的帮助类
  3. /// </summary>
  4. public class CheckExcelDuplicateHelper
  5. {
  6. /// <summary>
  7. /// 检查excel重复数据
  8. /// </summary>
  9. /// <typeparam name="T"></typeparam>
  10. /// <param name="list">数据集合</param>
  11. /// <param name="func">条件</param>
  12. /// <returns></returns>
  13. public static Response<string> Check<T>(List<T> list, Func<T, T, bool> func) where T : class
  14. {
  15. var result = new Response<string>();
  16. var oldAmount = list.Count;
  17. list = list.Distinct(new ComparerHelper<T>(func)).ToList();
  18. var newAmount = list.Count;
  19. if (oldAmount > newAmount)
  20. {
  21. result.Code = 500;
  22. result.Message = $"不允许有重复数据;";
  23. }
  24. return result;
  25. }
  26. }

最终调用如下:

  1. //检查Excel重复数据
  2. result = CheckExcelDuplicateHelper.Check(response.Result, (x, y) =>
  3. {
  4. return x.FactoryId == y.FactoryId && x.WorkshopId == y.WorkshopId && x.LineNameCN == y.LineNameCN;
  5. });

另外,在学习的时候,发现Func<T, bool>和Express<Func<T, bool>>是有区别的,特别是在查询数据库时,Func<T, bool>是从所有结果中查询,Express<Func<T, bool>>则是根据条件查询。

参考:https://www.cnblogs.com/walkerwang/archive/2013/03/26/2983153.html

c#比较器辅助类的更多相关文章

  1. Java比较器对数组,集合排序一

    数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...

  2. 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析

    收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...

  3. Java的几个同步辅助类

    Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...

  4. ASP.NET Core 中文文档 第四章 MVC(3.6.2 )自定义标签辅助类(Tag Helpers)

    原文:Authoring Tag Helpers 作者:Rick Anderson 翻译:张海龙(jiechen) 校对:许登洋(Seay) 示例代码查看与下载 从 Tag Helper 讲起 本篇教 ...

  5. DateHelper.cs日期时间操作辅助类C#

    //==================================================================== //** Copyright © classbao.com ...

  6. 同步辅助类CountDownLatch用法

    CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则使当前线程处于等待状态,调用countDow ...

  7. 基于MemoryCache的缓存辅助类

    背景: 1. 什么是MemoryCache? memoryCache就是用电脑内存做缓存处理 2.使用范围? 可用于不常变的数据,进行保存在内存中,提高处理效率 代码: /// <summary ...

  8. 关于MapReduce中自定义带比较key类、比较器类(二)——初学者从源码查看其原理

    Job类 /**   * Define the comparator that controls    * how the keys are sorted before they   * are pa ...

  9. java中被各种XXUtil/XXUtils辅助类恶心到了,推荐这种命名方法

    且看一下有多少个StringUtils 列举一下XXUtil/XXUtils恶劣之处 1. 不知道该用XXUtil还是用XXUtils, 或者XXHelper, XXTool 2. 不知道该用a.ja ...

随机推荐

  1. 浅谈Semaphore类-示例

    Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...

  2. 练手WPF(一)——模拟时钟与数字时钟的制作(上)

    一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...

  3. IdentityService4学习笔记之Client Credentials

    IdentityService4简介 一套为应用程序构建身份认证和访问控制解决方案/框架,包括单点登录,身份认证,授权和API访问控制. 前文 今天介绍ClientCredentials认证类型,适用 ...

  4. Maven学习 一 (下载安装)

    Maven简介 Apache Maven 是一个软件项目管理工具.基于项目对象模型(project Object Model ,POM)的概念,Maven可用来管理项目的依赖,编译,文档等信息 使用M ...

  5. nginx 反向代理时丢失端口的解决方案(转)

    今天,配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常:如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端 ...

  6. 在组件上使用v-model

    (1) 等价于: 其中$event.target.value表示获取输入框的值. (2)当用在组件上时,v-model 则会这样: 其中$event表示$emit抛出的值,即$emit的第二个参数. ...

  7. Win10 默认用Windows照片查看程序打开图片

    ::复制以下内容到记事本: @echo off&cd\&color 0a&cls echo 恢复Win10照片查看器 reg add "HKLM\SOFTWARE\M ...

  8. 探秘JVM的底层奥秘

    JVM的简单运行流程:主要将字节码文件加载到JVM的内存中,负责跨平台解释字节码文件到不同的操作系统. JVM的基本结构: 类加载器.执行引擎.运行时数据区域.本地接口 类的装载 加载.连接(验证.准 ...

  9. 安装Python,输入pip命令报错———pip Fatal error in launcher: Unable to create process using

    今天把Python的安装位置也从C盘剪切到了D盘, 然后修改了Path环境变量中对应的盘符:D:\Python27\;D:\Python27\Scripts; 不管是在哪个目录,Python可以执行了 ...

  10. pandas 之 groupby 聚合函数

    import numpy as np import pandas as pd 聚合函数 Aggregations refer to any data transformation that produ ...