/// <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. Blend Grid行列拖拽控制宽高

    原文:Blend Grid行列拖拽控制宽高 看效果 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width=&qu ...

  2. 基于Jquery的进度条插件(实用)

    Spin.js 最喜欢这款插件了,动画图片的长度.粗细.速度和角度都可以灵活控制,想要做成什么样都可以. 源码下载    在线演示   Percentage Loader 一款轻量的 jQuery 进 ...

  3. ASP.NET MVC IOC 之 Autofac(二)

    在上一章节,我们已经知道了再控制器中如何注入以及使用了.这一章,我们重点讲解下,如何在服务层中使用. 我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄.实现在教师类的服务层中调用 ...

  4. Flask应用启动流程

    目录 flask应用启动流程 WSGI 启动流程 flask应用启动流程 WSGI 所有的 python web 框架都要遵循 WSGI 协议 在这里还是要简单回顾一下 WSGI 的核心概念. WSG ...

  5. 【转载】c# datatable 判断值是否存在

    在C#的数据表格DataTable操作过程中,有时候在操作DataTable前需要判断DataTable中的值是否存在,此时首选需要判断DataTable是否为null值,而后在判断DataTable ...

  6. javascript:void(0); 和 href = "#"

    在做页面时,如果想做一个链接点击后不做任何事情,或者响应点击而完成其他事情,可以设置其属性 href = "#", 但是,这样会有一个问题,就是当页面有滚动条时,点击后会返回到页面 ...

  7. iperf3 网络测试工具

    Iperf3 是一个网络性能测试工具.Iperf可以测试最大TCP和UDP带宽性能,具有多种参数和UDP特性,可以根据需要调整,可以报告带宽.延迟抖动和数据包丢失.对于每个测试,它都会报告带宽,丢包和 ...

  8. 02篇ELK日志系统——升级版集群之kibana和logstash的搭建整合

    [ 前言:01篇LK日志系统已经把es集群搭建好了,接下来02篇搭建kibana和logstash,并整合完成整个ELK日志系统的初步搭建. ] 1.安装kibana 3台服务器: 192.168.2 ...

  9. Google Chrome 解决 “您的连接不是私密连接” 和被毒霸劫持

    一.解决 “您的连接不是私密连接” 前一段时间,Chrome 突然显示出了“您的连接不是私密连接”,这下可难受了,大部分的网站打开都有问题. 找了各种方法,各种设置都是不行. 一.暴力.费力的方法直接 ...

  10. 201871010105-曹玉中《面向对象程序设计(Java)》第二周学习总结

    201871010105-曹玉中<面向对象程序设计(Java)>第二周学习总结             项目                                         ...