扩展lamda表达中distinct按照字段去除重复
首先,我们定义一个Student类来测试.
public class Student
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
List<Student> data = new List<Student> {
new Student(){ID=,Name="名字1",Age=},
new Student(){ID=,Name="名字2",Age=},
new Student(){ID=,Name="名字3",Age=},
new Student(){ID=,Name="名字4",Age=},
new Student(){ID=,Name="名字5",Age=},
new Student(){ID=,Name="名字6",Age=}
};
在这样一个数据中. 我们发现,如果使用自带的 Distinct ,发现得数据依然是一样,并没有想象中的去除重复。
以下,给出几个解决方案。
第一种: 继承EqualityComparer
我们新建一个类。如下。且必须重写父类中的抽象方法。Equals和GetHashCode
public class StudentComparer : EqualityComparer<Student>
{
public override bool Equals(Student s1, Student s2)
{
//这里写你要去除重复的条件。
return s1.ID == s2.ID && s1.Name == s2.Name;
}
public override int GetHashCode(Student student)
{
return student.ID.GetHashCode();
}
}
使用方法:data.Distinct(new StudentComparer());
可以达到我们预料的效果,当然,这样比较麻烦一点。
第二种。我们可以根据非关联泛型集合HashSet<T>中的唯一性对distinct扩展
如何写扩展方法,这里我就不再细说。
具体扩展如下。
namespace System.Linq
{
public static class Class1
{
public static IEnumerable<T> DistinctBy2<T, TResult>(this IEnumerable<T> source, Func<T, TResult> where)
{
HashSet<TResult> hashSetData= new HashSet<TResult>();
foreach (T item in source)
{
if (hashSetData.Add(where(item)))
{
yield return item;
}
}
}
}
}
使用方法如下:data.DistinctBy2(p => new { p.ID,p.Name}).ToList<Student>(); //其中new {p.ID,P.Name}这里可指定要根据去重的字段
第三种。直接简单一点。通过先分组,然后在每个组里面取第一项。
代码如下:
//Lamda: new {item.ID,item.Name}指定去重字段
data.GroupBy(item => new { item.ID,item.Name }).Select(item => item.First()).ToList<Student>();
//-----------------------------------------------------------------
//Linq new {item.ID,item.Name}指定去重字段
(from item in data
group item by new { item.ID,item.Name} into g
select g.First()).ToList<Student>();
以上三种,都可以达到去重效果。当然,你可以选择第二种的扩展方法。
具体使用,看个人喜欢。
本文到此结束。
扩展lamda表达中distinct按照字段去除重复的更多相关文章
- sqlserver中distinct的用法(不重复的记录)
下面先来看看例子: table表 字段1 字段2 id name 1 a 2 b 3 c 4 ...
- C#根据对象的指定字段去除重复值
PersonInfo类: public class PersonInfo { public int Index; public string Name; public override string ...
- 怎么利用SQL语句查询数据库中具体某个字段的重复行
select * from [tablename] group by SeriNohaving count(SeriNo)<>1
- EF LINQ根据某个字段去除重复行
1.ydc.GameScore.OrderByDescending(o => o.Score).GroupBy(ic => ic.UserPhone).Select(g => g.F ...
- SQL中distinct 和 row_number() over() 的区别及用法
1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...
- Mysql查询某字段值重复的数据
查询user表中,user_name字段值重复的数据及重复次数 select user_name,count(*) as count from user group by user_name havi ...
- mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...
- DataTable中如何去除重复的项 (获得某个字段中的不重复项)
就是获取DataTable中某一列的值,因为从数据库中检索数据时,按照2个字段进行分组,而要获得的那一列刚好在分组这两列中,所以该列的值必然有重复,于是就想到了去除重复,有了思路以后在网上看了一些方法 ...
- Distinct和Group by去除重复字段记录
重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易解决,使用 s ...
随机推荐
- .Net开发笔记(十七) 应用程序扩展
在很多场合,我们需要在已有软件程序上增加一些新的功能,几乎所有原因是因为原有软件功能不能满足我们的需要,我们平时做的插件就属于这种情况,最常见的是VS IDE的插件开发,网上老外写的一篇关于插件开发的 ...
- 关于分工的思考 (Thoughts on Division of Labor)
Did you ever have the feeling that adding people doesn't help in software development? Did you ever ...
- Python 日志模块 logging通过配置文件方式使用
vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...
- SQL Server游标
什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...
- 【Win10 应用开发】集成语音命令
记得老周以前在写WP8应用开发的文章时,曾经写过语音命令集成的文章,后来8.1的时候“小娜”问世,但考虑到其变化不大,故老周没有补写相应的文章. 今天,老周打算补一下Win 10通用应用开发中,有关语 ...
- Javascript算法系列之快速排序(Quicksort)
原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...
- 轻量级前端MVVM框架avalon - 控制器
引子: 最近工作挺忙,avalon只能断断续续的写下去了,大概看了下angular的源码,看到小一半就比较难坚持了,是块硬骨头,慢慢啃吧 不过angular的的文档中用词还是很优雅: HTML编译器 ...
- 【转】oracle中in和exists的区别
原文地址:http://blog.itpub.net/7478833/viewspace-441043/ 感谢作者 in 和 exists区别 in 是把外表和内表作hash join,而ex ...
- ListView+CheckBox实现全选 单击效果
在网上也找了一些案例,但都是用Map来实现的.我的是把对象绑定到当前控件上.代码稍微简洁. main布局文件:main.xml <?xml version="1.0" enc ...
- 如何远程备份MySQL binlog
以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中.但是这其中还是有一定风险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的bin ...