用泛型的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 ...
随机推荐
- hadoop2 作业执行过程之reduce过程
reduce阶段就是处理map的输出数据,大部分过程和map差不多 //ReduceTask.run方法开始和MapTask类似,包括initialize()初始化,根据情况看是否调用runJobCl ...
- java中的链式编程
听到链式编程听陌生的,但是写出来就感觉其实很熟悉 package test; public class Test { String name; String phone; String mail; S ...
- 利用map可以对很大的数出现的次数进行记数
Problem Description In the year 8888, the Earth is ruled by the PPF Empire . As the population growi ...
- ios uitableviewcell动态计算高度
#import <UIKit/UIKit.h> @interface TestCell : UITableViewCell @property (weak, nonatomic) IBOu ...
- CSS3: border-radius边框圆角详解
border-radius 基本语法: border-radius : none | <length>{1,4} [/ <length>{1,4} ]? 取值范围: <l ...
- c#代码使用ResourceDictionary样式
对于ResourceDictionary样式代码: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006 ...
- C#使用简单邮件传输协议(SMTP)发送邮件
1.首先引入命名空间: using System.Net.Mail; 2.定义邮件配置类: public class EmailServiceConfig { /// <summary> ...
- POJ 2516 Minimum Cost 最小费用流
题目: 给出n*kk的矩阵,格子a[i][k]表示第i个客户需要第k种货物a[i][k]单位. 给出m*kk的矩阵,格子b[j][k]表示第j个供应商可以提供第k种货物b[j][k]单位. 再给出k个 ...
- poj 1698 Alice's Chance 最大流
题目:给出n部电影的可以在周几拍摄.总天数.期限,问能不能把n部电影接下来. 分析: 对于每部电影连上源点,流量为总天数. 对于每一天建立一个点,连上汇点,流量为为1. 对于每部电影,如果可以在该天拍 ...
- 转:基于TLS1.3的微信安全通信协议mmtls介绍
转自: https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=2649286266&idx=1&sn=f5d049033e ...