扩展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 ...
随机推荐
- 剑指Offer面试题:28.连续子数组的最大和
一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...
- 你必须知道的指针基础-1.预备篇:搭建GCC开发环境
一.关于GCC编译器 GCC(GNU Compiler Collection)是一套功能强大.性能优越的编程语言编译器,它是GNU计划的代表作品之一.GCC是Linux平台下最常用的编译器,GCC原名 ...
- java.lang.IndexOutOfBoundsException at java.io.FileOutputStream.writeBytes(Native Method)
ss available : /usr/linkapp/data/linkapp/ddn_1440639847758_temp java.lang.IndexOutOfBoundsException ...
- Java抽象类的总结
什么是抽象类: 当你在定义一个父级的类的时候,往往在父级内的方法没有添加任何内容,这时候如果你在子类里面调用父级的时候,万一在子类之中类名或者方法名没有写正确,会出现不执行的情况,但是这种情况默认是不 ...
- gulp思考
Gulp,一个基于流的构建工具. 这是自己写的一个构建的demo,只是一个纯演示的示例,并没有完成什么项目工作.下面根据这个demo介绍一下Gulp. 上代码: gulpfile.js 'use st ...
- 2013 duilib入门简明教程 -- 界面设计器 DuiDesigner (10)
上一个教程讲解了怎么布局最大化.最小化.关闭按钮,但是如果手动去计算这三个按钮的位置和大小的话,非常的不直观,也很不方便. 所以这一章准备介绍duilib的UI设计器,由于这个设计器很 ...
- LeetCode OJ1:Reverse Words in a String
问题描述: Given an input string, reverse the string word by word. For example,Given s = "the sky is ...
- VMWare vSphere Client 克隆虚拟机 更改IP
克隆虚拟机后,查看该虚拟机所分配的MAC地址. 打开控制台,进入linux界面. 打开/etc/udev/rules.d/70-persistent-net.rules内容如下面例子所示: # vi ...
- Css概要与选择器,刻度单位
目录 一.CSS3概要 1.1.特点 1.2.效果演示 1.3.帮助文档与学习 二.选择器 1.1.基础的选择器 1.2.组合选择器 1.3.属性选择器 1.4.伪类 1.5.伪元素 三.特殊性(优先 ...
- 使用hexo搭建github.io博客(一)
使用github.io可以搭建一个自己的博客,把静态文件项目托管到github上,可以写博客,可以使用markdown语法,也可以展示作品.灵活性高.但是有较大的难度. node,git版本变化日新月 ...