使用代理实现对C# list distinct操作
范型在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操作的更多相关文章
- 通过vb.net 和NPOI实现对excel的读操作
通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...
- Python中实现对list做减法操作介绍
Python中实现对list做减法操作介绍 这篇文章主要介绍了Python中实现对list做减法操作介绍,需要的朋友可以参考下 问题描述:假设我有这样两个list, 一个是list1,list1 = ...
- 利用C#实现对excel的写操作
一.COM interop 首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信.Visual Studio .NET 通过引入面向公共 ...
- PHP实现对MongoDB的基础操作
PHP扩展 PHP5.2.PH ...
- 使用POI来实现对Excel的读写操作
事实上我感觉直接贴代码就好了.代码里面差点儿做到每一行一个凝视.应该看起来会比較简单 代码托管在github上:https://github.com/chsj1/ExcelUtils package ...
- jmeter实现对Oracle数据库的操作
实现目的 有时候,根据业务需要,可能需要直接对数据库进行性能测试,此时可利用jmeter对Oracle.MySQL等数据库进行相关测试. 脚本实现 添加JDBC Connection Configur ...
- 使用jxl操作之一: 实现对Excel简单读写操作
项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...
- JQuery实现对html结点的操作(创建,添加,删除)
效果图: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- 利用COM组件实现对WORD书签各种操作大全,看这一篇就够了
有个需求是,程序导出一份word报告,报告中有各种各样的表格,导出时还需要插入图片. 脑海中迅速闪过好几种组件,openxml组件,com组件,npoi.为了减少程序画复杂表格,我们选用了com组件+ ...
随机推荐
- opencart精简checkout购物流程
最近在做一个商城项目,让外国朋友帮忙看看,他给我们一些建议了,其中他说Can You make more simple buying Button,3 step:Sign up :Shipping A ...
- [Android]使用Spring for Android改善数据交互流程
如果开发一个和服务端有数据交互android应用,流程通常是这样的:界面收集用户数据之后,将它转换成JSON或者XML格式的字符串,以HTTP的方式提交给服务端,获得返回的文本数据,再将数据解析为ja ...
- box-sizing:border-boxing的使用
<div class="box"></div> .box { margin-top: 200px; margin-left: 200px; backgrou ...
- 怎么eclipse或MyEclipse中添加javaSe的源码
怎么eclipse或MyEclipse中添加javaSe的源码 有时在eclipse里我们调用java提供给我们的方法,我们有时需要查看java提供给我们的调用方法的源码或java提供给我们的核心类的 ...
- 详解Java内存区域?虚拟机类加载机制?
一.Java运行时数据区域 1.程序计数器 “线程私有”的内存,是一个较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器.Java虚拟机规范中唯一一个没有OutOfMemoryError情况 ...
- js闭包讲解
今日看到之前写的一段js代码,关于导航部分鼠标放上去变类,鼠标离开等效果 前端代码 <div class="con12"> <div class="le ...
- ASP.NET页面之间传值的方式之Server.Transfer(个人整理)
Server.Transfer 这个方法相比以前介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写 ...
- ldd ldconfig
ldd - print shared object dependencies ldconfig 主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目 ...
- liunx驱动----USB驱动
现象:把usb设备接入电脑 1.Windows发现设备 2.跳出一个对话框提示安装驱动程序 问1:既然没有驱动程序,为什么了够知道是什么驱动了?? 答1:Windows里面已经有了usb总线驱动程序, ...
- dbf,Idx 文件格式
NDbfReaderEx about_indexes ntx file format