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 ...
随机推荐
- RookeyFrame2.0发布,UI重构
RookeyFrame2.0在原来1.0的基础上进行了UI的重构,设计了扁平化的样式风格,看起来更清爽,更赏心阅目,由于之前工作比较忙升级比较慢,后续会投入比较多时间来更新维护,同时针对二次开发项目做 ...
- 记录一次OracleJDK开发的项目发部到Linux中使用OpenJDK启动后失败的错误的解决方案
一.现象 基于JAVA SpringBoot2.0.4的项目,发部后项目发部后,放到OpenJDK环境中运行时,提示下列错误: 2019-10-22 10:03:55 [main] WARN o.s ...
- JS基石之-----防抖节流函数
防抖和节流函数 阅读目录 一 .防抖函数 二 .节流函数 三 .个人理解两者的区别 一.防抖函数 1.1 概念: 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算 ...
- current transaction is aborted, commands ignored until end of transaction block
current transaction is aborted, commands ignored until end of transaction block Error updating datab ...
- flask 简单示例
flask import flask from flask import jsonify from flask import request # 要获取到请求参数的话,就要导入这个模块 ''' 创建接 ...
- OAuth 2.0 的四种授权模式
RFC 6749 OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么. OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.......资源 ...
- 使用PSCI机制的SMP启动分析
其他core的入口 文件:arch/arm64/kernel/head.S secondary_entry: 在从bl31切到EL1上的Linux Kernel后: 第595行,在el2_setup中 ...
- 二、urllib库的使用详解
一.urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2 是 ...
- oracle 导入导出表
imp username/pwd@orcl file=c:\temp\exp.dmp tables=(table1, table2)#imp username/pwd@ip:1521/orcl ful ...
- 如何使用Activator.CreateInstance创建一个列表<T>,其中T在运行时是未知的?
参考网址:https://cloud.tencent.com/developer/ask/185965 using System; using System.Collections.Generic; ...