用泛型的IEqualityComparer<T>接口去重复项
提供者:porschev
题目:下列数据放在一个List中,当ID和Name都相同时,去掉重复数据
ID Name
1 张三
1 李三
1 小伟
1 李三
2 李四
2 李武
------------------------------------------------------------------------------------------------------------
解决这个问题,方法很多,最开始想到的就Enumerable.Distinct方法
我们可能经常用的是Distinct<TSource>(IEnumerable<TSource>)
用它对数组这一类去重复
这里要用Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>)使用指定的 IEqualityComparer<T> 对值进行比较
一、先为数据做个实体类:User
public class User
{
public User(int id, string name)
{
Id = id;
Name = name;
} public int Id { get; set; } public string Name { get; set; }
}
二、再自定义一个User比较类(实现IEqualityComparer<T>接口):UserComparer
public class UserComparer : IEqualityComparer<User>
{
#region IEqualityComparer<User> 成员
public bool Equals(User x, User y)
{
if (x.Id == y.Id && x.Name == y.Name) //分别对属性进行比较
return true;
else
return false;
} public int GetHashCode(User obj)
{
return ;
}
#endregion
}
自定义一个比较类,去继承IEqualityComparer接口,做一个Distinct方法的比较器。。
Equals方法中对实体进行和你需求相关的比较操作,返回bool类型的返回值
三、最后是去重复测式类:
XXXX.Distinct(new UserComparer());进行去重复操作
public class MainClass
{
public static void Main()
{
List<User> list = new List<User>(); //添加一些测式数据
list.Add(new User(, "张三"));
list.Add(new User(, "李三"));
list.Add(new User(, "小伟"));
list.Add(new User(, "李三"));
list.Add(new User(, "李四"));
list.Add(new User(, "李武")); var query = list.Distinct(new UserComparer()); //去重复 foreach (var item in query)
{
Console.WriteLine(item.Id + "," + item.Name); //输出Distinct之后的结果
} Console.ReadLine(); //输出结果:
// 1 , 张三
// 1 , 李三
// 1 , 小伟
// 2 , 李四
// 2 , 李武
}
}
或者直接:
public class User:IEqualityComparer<User>
{
public User(int id, string name)
{
Id = id;
Name = name;
} public int Id { get; set; } public string Name { get; set; } public bool Equals(User x, User y)
{
if (x.Id == y.Id && x.Name == y.Name) //分别对属性进行比较
return true;
else
return false;
} public int GetHashCode(User obj)
{
return ;
}
}
public class MainClass
{
public static void Main()
{
List<User> list = new List<User>(); //添加一些测式数据
list.Add(new User(, "张三"));
list.Add(new User(, "李三"));
list.Add(new User(, "小伟"));
list.Add(new User(, "李三"));
list.Add(new User(, "李四"));
list.Add(new User(, "李武")); var query = list.Distinct(new User()); //去重复 foreach (var item in query)
{
Console.WriteLine(item.Id + "," + item.Name); //输出Distinct之后的结果
} Console.ReadLine(); //输出结果:
// 1 , 张三
// 1 , 李三
// 1 , 小伟
// 2 , 李四
// 2 , 李武
}
}
用泛型的IEqualityComparer<T>接口去重复项的更多相关文章
- [2012-05-31]awk去重复项
参考http://bbs.chinaunix.net/thread-2309494-1-1.html 10.awk '! a[$0]++' 怎么理解? 这是一个非常经典的去重复项的awk语句,虽然短小 ...
- VBA RemoveDuplicates方法去重复项
RemoveDuplicates后边必须跟参数否则不起作用 ActiveSheet.Range("G21:R36").RemoveDuplicates Columns:=12, H ...
- 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式
为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...
- 利用Linq对集合元素合并、去重复处理
本文转载:http://www.cnblogs.com/yjmyzz/archive/2012/12/18/2823170.html 今天写代码时,需要对一个数组对象中按一定规则合并.去重处理,不想再 ...
- ASP.Net【如何合并DataTable,并且去重复方法】
虽然DataTable.Merge可以很好的实现,但以下代码写出来更好理解 DataTable DataTable1 = new DataTable(); DataTable DataTable2 = ...
- 如何求ArrayList集合的交集 并集 差集 去重复并集
需要用到List接口中定义的几个方法: addAll(Collection<? extends E> c) :按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾 ...
- 泛型(Generic)接口
泛型接口例子:一个学生有一个独一无二的ID,但是每个学生的姓名不一定是唯一的. class Program { static void Main(string[] args) { Student< ...
- mysql数据库去重复
参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
随机推荐
- 关于调试程序接收通过adb发送带有参数的广播问题
一句话,如果你检查完格式没有错:关于通过adb启动Activity.activity.service以及发送broadcast的命令 am broadcast -a myAction --es cit ...
- 2.1.5 用SSS扫描器实施扫描
SSS(Shadow Security Scaner)是一款著名的系统漏洞扫描器,可对很大范围内的系统漏洞进行安全.高效.可靠的安全检测,其系统扫描的速度与精度足以让用户敢和专业安全机构的人以及那些专 ...
- Ubuntu/Debian 安装lxml的正确方式
lxml是Python的一个库,主要用于处理XML和HTML. 最近需要用lxml,但是在Ubuntu上直接pip安装失败,研究了半天终于找到了正确安装方法,记录在此. 由于Ubuntu和Debian ...
- hdu 3909 数独扩展
思路:做法与9*9的一样.只不过是变量. #include<set> #include<map> #include<cmath> #include<queue ...
- Javascript -- toFixed()函数
Javascript——toFiexed()函数 1. toFixed(n) 限制小数点后位数,四舍五入.n:0~20 . 2. 作用对象必须是number,不能为其他类型.如(8.001).toFi ...
- DevExpress使用之ChartControl控件绘制图表(多坐标折线图、柱状图、饼状图)
最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...
- LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg
LINQ to SQL 语句(3) 之 Count/Sum/Min/Max/Avg [1] Count/Sum 讲解 [2] Min 讲解 [3] Max 讲解 [4] Average 和 Agg ...
- Wim技术之Wim文件的制作
背景:操作的镜像文件为win8.1 update的ISO里的Wim文件 1.使用如下命令将支持WimBoot的instal.Wim文件转换成可以支持wimboot启动的映像文件 Dism /Expor ...
- eBay 开发流程
1[记录]注册成为eBay开发者(eBay Developers Program)+创建Sanbox Key和Production Key http://www.crifan.com/register ...
- Cocos移植到Android的一些问题-SQLite3数据库移植问题
首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一 ...