/// <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#比较器辅助类的更多相关文章

  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. winform窗体自适应大小

    1.添加一个类class AutoSizeFormClass { //(1).声明结构,只记录窗体和其控件的初始位置和大小. public struct controlRect { public in ...

  2. .NET EF执行sql报数组超出了索引

    使用ef查询,写sql语句的 一般情况报数组超出了索引都认为是[i]里面的值超出了,但是执行sql报超出了索引,让人很蒙 在网上找了半天也没有结果,后来只能自己来解决了. 在异常里面能看到dbnull ...

  3. 我是如何一步步编码完成万仓网ERP系统的(九)产品库设计 5.产品属性项

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  4. 性能监控工具的配置及使用 - Spotlight On Oracle(oracle)

    一.    Spotlight On Oracle(oracle)1.1.   工具简介Spotlight是一个强有力的Oracle数据库实时性能诊断工具,提供了一个直观的.可视化的数据库活动展现.S ...

  5. PIE SDK影像快速拼接

    1.算法功能简介 快速拼接是对若干幅互为邻接的遥感数字图像拼在一起,构成一幅整体影像的技术过程.PIE支持快速拼接算法功能的执行,下面对快速拼接算法功能进行介绍. 2.算法功能实现说明 2.1 实现步 ...

  6. 基于第三方vuejs库组件做适配性个性开发

    相信大家在使用vuejs时候会用到很多的第三方库,能够找到适合自己的库并且加以使用可以大大加快进度,减少bug.但是很多时候会出现这样一个尴尬的境地: 基线的第三方组件并不能很好地满足我们自己地需求, ...

  7. 2019 农信互联java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.农信互联等公司offer,岗位是Java后端开发,因为发展原因最终选择去了农信互联,入职一年时间了,也成为了面 ...

  8. idea中 Application Server not specified

    一.问题 idea中的tomcat报错: Application Server not specified 二.解决 原因是没有关联本地的tomcat,关联本地tomcat即可

  9. 【计算机网络】windows修改本机hosts文件

    hosts 文件所在的位置 C:/windows/system32/drivers/etc/hosts 修改后不必重启立即生效的方法 命令行下运行: ipconfig /displaydns 显示所有 ...

  10. BareTail(日志查看工具)

    官网:http://www.baremetalsoft.com/baretail/index.php 在看log文件时,当日志有新增时,会自动滚动到最新的那一行,对于查看实时日志有作用.