c#比较器辅助类
- /// <summary>
- /// 比较器帮助类
- /// 创建人:苏本东
- /// 创建时间:2019-11-5 11:52:29
- /// </summary>
- public class ComparerHelper<T> : IEqualityComparer<T>
- {
- private readonly Func<T, T, bool> _func;
- /// <summary>
- /// 构造方法
- /// </summary>
- /// <param name="func"></param>
- public ComparerHelper(Func<T, T, bool> func)
- {
- this._func = func;
- }
- /// <summary>
- /// 比较是否相等
- /// </summary>
- /// <param name="x"></param>
- /// <param name="y"></param>
- /// <returns></returns>
- public bool Equals(T x, T y)
- {
- return this._func(x, y);
- }
- /// <summary>
- /// 返回哈希代码
- /// </summary>
- /// <param name="obj"></param>
- /// <returns></returns>
- public int GetHashCode(T obj)
- {
- //说明:此场景,不管obj的hashcode还是obj.id的hashcode都不会相同
- //而如果hashcode不相同,就不会走到equals方法
- //所以我们这里必须返回相同的hashcode,只有这样,equals方法才有机会被执行
- return 1;
- }
- }
比较的条件是一个匿名函数,通过构造方法传入。仔细看标红的文字。参考:https://www.cnblogs.com/mirageJ/p/8950842.html
随后又封装了一个类进行调用
- /// <summary>
- /// 检查excel数据是否重复的帮助类
- /// </summary>
- public class CheckExcelDuplicateHelper
- {
- /// <summary>
- /// 检查excel重复数据
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="list">数据集合</param>
- /// <param name="func">条件</param>
- /// <returns></returns>
- public static Response<string> Check<T>(List<T> list, Func<T, T, bool> func) where T : class
- {
- var result = new Response<string>();
- var oldAmount = list.Count;
- list = list.Distinct(new ComparerHelper<T>(func)).ToList();
- var newAmount = list.Count;
- if (oldAmount > newAmount)
- {
- result.Code = 500;
- result.Message = $"不允许有重复数据;";
- }
- return result;
- }
- }
最终调用如下:
- //检查Excel重复数据
- result = CheckExcelDuplicateHelper.Check(response.Result, (x, y) =>
- {
- return x.FactoryId == y.FactoryId && x.WorkshopId == y.WorkshopId && x.LineNameCN == y.LineNameCN;
- });
另外,在学习的时候,发现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#比较器辅助类的更多相关文章
- Java比较器对数组,集合排序一
数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...
- 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析
收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...
- Java的几个同步辅助类
Java为我们提供了一些同步辅助类,利用这些辅助类我们可以在多线程编程中,灵活地把握线程的状态. CountDownLatch CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行 ...
- ASP.NET Core 中文文档 第四章 MVC(3.6.2 )自定义标签辅助类(Tag Helpers)
原文:Authoring Tag Helpers 作者:Rick Anderson 翻译:张海龙(jiechen) 校对:许登洋(Seay) 示例代码查看与下载 从 Tag Helper 讲起 本篇教 ...
- DateHelper.cs日期时间操作辅助类C#
//==================================================================== //** Copyright © classbao.com ...
- 同步辅助类CountDownLatch用法
CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则使当前线程处于等待状态,调用countDow ...
- 基于MemoryCache的缓存辅助类
背景: 1. 什么是MemoryCache? memoryCache就是用电脑内存做缓存处理 2.使用范围? 可用于不常变的数据,进行保存在内存中,提高处理效率 代码: /// <summary ...
- 关于MapReduce中自定义带比较key类、比较器类(二)——初学者从源码查看其原理
Job类 /** * Define the comparator that controls * how the keys are sorted before they * are pa ...
- java中被各种XXUtil/XXUtils辅助类恶心到了,推荐这种命名方法
且看一下有多少个StringUtils 列举一下XXUtil/XXUtils恶劣之处 1. 不知道该用XXUtil还是用XXUtils, 或者XXHelper, XXTool 2. 不知道该用a.ja ...
随机推荐
- 浅谈Semaphore类-示例
Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...
- 练手WPF(一)——模拟时钟与数字时钟的制作(上)
一.Visual Studio创建一个WPF项目. 简单调整一下MainWindow.xaml文件.主要使用了两个Canvas控件,分别用于显示模拟和数字时钟,命名为AnalogCanvas.digi ...
- IdentityService4学习笔记之Client Credentials
IdentityService4简介 一套为应用程序构建身份认证和访问控制解决方案/框架,包括单点登录,身份认证,授权和API访问控制. 前文 今天介绍ClientCredentials认证类型,适用 ...
- Maven学习 一 (下载安装)
Maven简介 Apache Maven 是一个软件项目管理工具.基于项目对象模型(project Object Model ,POM)的概念,Maven可用来管理项目的依赖,编译,文档等信息 使用M ...
- nginx 反向代理时丢失端口的解决方案(转)
今天,配置nginx反向代理时遇到一个问题,当设置nginx监听80端口时转发请求没有问题.但一旦设置为监听其他端口,就一直跳转不正常:如,访问欢迎页面时应该是重定向到登录页面,在这个重定向的过程中端 ...
- 在组件上使用v-model
(1) 等价于: 其中$event.target.value表示获取输入框的值. (2)当用在组件上时,v-model 则会这样: 其中$event表示$emit抛出的值,即$emit的第二个参数. ...
- Win10 默认用Windows照片查看程序打开图片
::复制以下内容到记事本: @echo off&cd\&color 0a&cls echo 恢复Win10照片查看器 reg add "HKLM\SOFTWARE\M ...
- 探秘JVM的底层奥秘
JVM的简单运行流程:主要将字节码文件加载到JVM的内存中,负责跨平台解释字节码文件到不同的操作系统. JVM的基本结构: 类加载器.执行引擎.运行时数据区域.本地接口 类的装载 加载.连接(验证.准 ...
- 安装Python,输入pip命令报错———pip Fatal error in launcher: Unable to create process using
今天把Python的安装位置也从C盘剪切到了D盘, 然后修改了Path环境变量中对应的盘符:D:\Python27\;D:\Python27\Scripts; 不管是在哪个目录,Python可以执行了 ...
- pandas 之 groupby 聚合函数
import numpy as np import pandas as pd 聚合函数 Aggregations refer to any data transformation that produ ...