范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复。而一般的如果要对list去重复如果使用linq distinct方式,会遇到一些坑爹的问题,发现结果集中还是存在重复数据,原因是使用这种方法是对对象的引用去重复,并不满足我们的需求。因此本文通过c#代理的方式实现对list distinct操作。

先介绍一下对list去重复传统的方法,代码如下:

List<ReviewersReport> reportList=GetReportList();
for (int i = ; i < reportList.Count; i++)
{
for (int j = i + ; j < reportList.Count; j++)
{
if (reportList[i].Equals(reportList[j]))
{
reportList.RemoveAt(reportList.LastIndexOf(reportList[i]));
j--;
}
}
}

通过这种方式对list 实现distinct操作显然比较麻烦,如果还有其他的list实体集也需要实现类似的功能,那我们就会为代码的可重用性担心了。

下面使用简单高效的方式去实现list的distinct功能,也是本文推荐的方式了

先创建一个Compare类,如下:

public delegate bool EqualsComparer<T>(T x, T y);
public class Compare<T> : IEqualityComparer<T>
{
private EqualsComparer<T> _equalsComparer; public Compare(EqualsComparer<T> equalsComparer)
{
this._equalsComparer = equalsComparer;
} public bool Equals(T x, T y)
{
if (null != this._equalsComparer)
return this._equalsComparer(x, y);
else
return false;
}
public int GetHashCode(T obj)
{
return obj.ToString().GetHashCode();
}
}

这里在构造器中传递一个delegate,调用者可以在这个delegate定义比较规则,这样具有了极大的灵活性,我们可以注意到Compare实现了IEqualityComparer接口来自定义比较对象,判断两个对象是否相等。使用方式如下:

ist<ReviewersReport> requestList =Get RequestList ();
requestList =requestList.Distinct(new Compare<Requestor>((x, y) => (null != x && null != y) && (x.RequestorName.Equals(y.RequestorName)))).ToList();

用这种方式大大的扩展了比较器的使用范围,增加了代码的可重用性,可以适用于任何对象的比较。

比较后我们可以对起进行排序,使代码也很简洁。

requestList.Sort(delegate(Requestor r1, Requestor r2) { return r1.RequestorCSL.CompareTo(r2.RequestorCSL); });

希望对园友们有所帮助。。。

使用代理实现对C# list distinct操作的更多相关文章

  1. 通过vb.net 和NPOI实现对excel的读操作

    通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...

  2. Python中实现对list做减法操作介绍

    Python中实现对list做减法操作介绍 这篇文章主要介绍了Python中实现对list做减法操作介绍,需要的朋友可以参考下 问题描述:假设我有这样两个list, 一个是list1,list1 = ...

  3. 利用C#实现对excel的写操作

    一.COM interop 首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信.Visual Studio .NET 通过引入面向公共 ...

  4. PHP实现对MongoDB的基础操作

    PHP扩展                                                                                      PHP5.2.PH ...

  5. 使用POI来实现对Excel的读写操作

    事实上我感觉直接贴代码就好了.代码里面差点儿做到每一行一个凝视.应该看起来会比較简单 代码托管在github上:https://github.com/chsj1/ExcelUtils package ...

  6. jmeter实现对Oracle数据库的操作

    实现目的 有时候,根据业务需要,可能需要直接对数据库进行性能测试,此时可利用jmeter对Oracle.MySQL等数据库进行相关测试. 脚本实现 添加JDBC Connection Configur ...

  7. 使用jxl操作之一: 实现对Excel简单读写操作

    项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...

  8. JQuery实现对html结点的操作(创建,添加,删除)

    效果图: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  9. 利用COM组件实现对WORD书签各种操作大全,看这一篇就够了

    有个需求是,程序导出一份word报告,报告中有各种各样的表格,导出时还需要插入图片. 脑海中迅速闪过好几种组件,openxml组件,com组件,npoi.为了减少程序画复杂表格,我们选用了com组件+ ...

随机推荐

  1. layui 重加载

    tableIns.reload({ page: { curr: 1 //重新从第 1 页开始 } }); tableIns为layui 表格定义的函数 var tableIns= table.rend ...

  2. 常用Java技术社区

      Java生态圈知识链: 求职平台 阿里巴巴社招平台 杭州网易社招平台 微店社招平台 银联社招平台 百度社招平台 Java生态圈知识链: 个人优秀博客 腾讯_运维工程师_刘天斯 阿里_Android ...

  3. 基于ROS的分布式机器人远程控制平台

    基于ROS的分布式机器人远程控制平台   1 结构说明 HiBot架构主要使用C/S架构,其中HibotServer为服务器,Muqutte为消息服务器中间件,HiBotClient为运行在机器人上的 ...

  4. C#递归复习

    static void Main(string[] args) {  Console.WriteLine("请输入你要的数字:");  long flag = Convert.To ...

  5. c++中的auto、const auto&

    先介绍一下auto.const: 在块作用域.命名作用域.循环初始化语句等等  中声明变量时,关键词auto用作类型指定符. const:修饰符 接下来我们细细分析一下: (1)auto auto即 ...

  6. 20175201课下作业 MyCP

    要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为十进 ...

  7. linux架构师之路!

    目录 1.shell编程总结 2.python编程总结 3.网络基础总结 4.存储的基本知识 5.linux常用 架构学习目录 1.网站架构 2.架构师技术图谱 3.python之路 4.IBM技术主 ...

  8. B. Lynyrd Skynyrd

    传送门: 题意:给出 n,m,q 然后给出模板串,从1-n数字只出现一次,然后给出长度为m的要询问的串. q组询问:每组询问输出 ‘1’或者‘0’ 每组询问 一对x,y    问在x到y中有没有模板串 ...

  9. Scala控制语句

    2019-04-16 19:03:01 if else 表达式 var sumVal = 0 if ( sumVal == 0 ) { println("true") } else ...

  10. Windows 10,鼠标右键-发送到-桌面快捷方式缺失解决方法

    1-双击“我的电脑”. 进到这里 2-路径框修改为“shell:Sendto”,回车. 3-把“桌面快捷方式”黏贴到Sendto文件夹下