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 ...
随机推荐
- RandomAccessFile vs FileChannel.open(path);
What kind of FileChannel object does the FileChannel.open(path) method return? Is it still random ac ...
- Loadrunner 11.00 初始化失败; 通信错误。 Error (-81024): LR_VUG: The 'WS_SOAP' type is not supported on 'WIN32' platforms .
搜索LR安装目录bin文件夹下有个“wlrun.exe”的文件,邮件点击“属性”->"兼容性"->兼容模式中选择“windows 7”,确认后重新打开即可,win10下 ...
- tkinter事件键盘绑定
tkinter事件键盘绑定 from tkinter import * root=Tk() #创建一个框架,在这个框架中响应事件 frame=Frame(root, width=200,height= ...
- 【开发笔记】- grails框架中在使用domain的save方法保存时保存不成功
1.如果报错,自行根据异常查找错误,这里不说明 2.如果为报错,我遇到的就是domain中的字段属性与数据库中为同步 (1)你的domain是新的,在增加新的字段属性时未使用update更新数据库,造 ...
- android 第三方开源库 学习汇总之Butter Knife
如果直接在App中使用,那么只需要在app的build.gradle中添加即可. android { ... // Butterknife requires Java 8. compileOption ...
- Linux的基本指令(2)-Linux从入门到精通第三天(非原创)
文章大纲 一.高级指令二.练习题三.学习资料下载四.参考文章 一.高级指令 1. hostname指令 作用:操作服务器的主机名(读取.设置)语法1:#hostname 含义:表示输出完整的主机名 ...
- Mac Brew 安装及配置
mac 终端下,执行以下命令,即可安装brew: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homeb ...
- 适用于Centos6/7,vsftp自动安装脚本
#!/bin/bash #vsftp install . /etc/rc.d/init.d/functions NUM=`rpm -q centos-release | awk -F '-' '{pr ...
- Linux源码编译nginx
1.安装nginx 安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel 首先要安装 ...
- MySQL的rpm安装教程
Linux 上安装 MySQL Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址: MySQL - MySQL服务器.你需要该选项,除非你只想连接运行在另 ...