首先,我们定义一个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按照字段去除重复的更多相关文章

  1. sqlserver中distinct的用法(不重复的记录)

    下面先来看看例子: table表 字段1     字段2   id        name   1           a   2           b   3           c   4    ...

  2. C#根据对象的指定字段去除重复值

    PersonInfo类: public class PersonInfo { public int Index; public string Name; public override string ...

  3. 怎么利用SQL语句查询数据库中具体某个字段的重复行

    select * from [tablename] group by SeriNohaving count(SeriNo)<>1

  4. EF LINQ根据某个字段去除重复行

    1.ydc.GameScore.OrderByDescending(o => o.Score).GroupBy(ic => ic.UserPhone).Select(g => g.F ...

  5. SQL中distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  6. Mysql查询某字段值重复的数据

    查询user表中,user_name字段值重复的数据及重复次数 select user_name,count(*) as count from user group by user_name havi ...

  7. mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,

      在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...

  8. DataTable中如何去除重复的项 (获得某个字段中的不重复项)

    就是获取DataTable中某一列的值,因为从数据库中检索数据时,按照2个字段进行分组,而要获得的那一列刚好在分组这两列中,所以该列的值必然有重复,于是就想到了去除重复,有了思路以后在网上看了一些方法 ...

  9. Distinct和Group by去除重复字段记录

    重复记录 有两个意义,一是完全重复的记录,也即所有字段均重复的记录 二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略. 1.对于第一种重复,比较容易解决,使用 s ...

随机推荐

  1. 备忘录:hadoop技术一点积累

    1.hbase的rowkey是按字典排序的,我看有的资料建议rowkey设计不应该是自增的,应该和这个字典排序相关吧 2.hbase的数据存储是按照region来的,region的设计前段时间在坐飞机 ...

  2. android服务里生成通知点击后返回正在运行的程序和当前的Activity

    想在服务里生成一个通知,并且点击通知打开当前应用程序下单当前活动,折腾了半天,网上的那些都不靠谱,试了半天,最后把ActivityManager和反射都用进来了,终于解决了这个问题.这样在服务中想恢复 ...

  3. 老司机学新平台 - Xamarin开发环境及开发框架初探

    随着被微软收购,最近一年间,Xamarin的火爆程度与日俱增.免费.更好的VS2015集成.更好的模拟器,甚至,在windows上运行和调试iOS平台程序,让我这样接触了十几年.NET平台的老司机,即 ...

  4. java中构造方法的特殊性

    构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...

  5. cookie自动登录的实现

         cookie自动登录是指把用户登录的信息按期限(自定)保存在客户端,当用户请求登录时判断客户端用没有cookie对象,有的话填充值,否则登录界面的输入框为空,不进行填充.      登录界面 ...

  6. 【原】安装Win7和Ubuntu双系统后,Win7耳机无声音的解决办法

    最近安装了Ubuntu的桌面版,作成了双系统,可是发现了一个问题:进入Win7后有时插耳机会没有声音,外放有声音.后来更新驱动也没有解决问题,最后在网上查到了解决办法. 产生原因:进入Ubuntu后, ...

  7. Redis在windows环境下ThinkPHP的安装和使用

    1.Redis概述: 2.Redis在windows环境下的安装: 下载地址:https://github.com/dmajkic/redis/downloads,选取其中一个zip压缩包:

  8. 由于Replication,DBCC Shrink不能收缩Log File

    使用Backup创建测试环境之后,发现testdb的Log File过大,达到400GB,由于测试环境实际上不需要这么大的Log Space,占用400GB的Disk Space实在浪费Disk Re ...

  9. Trace Flag

    Trace Flag能够影响Sql Server的行为,主要用于diagnose performance issue,官方解释是: Trace flags are used to temporaril ...

  10. ajax局部刷新后,如何让局部中的百度分享重新加载

    我这个人不怎么喜欢说太多话,看几个图你们就懂了 Ajax前 Ajax之后 原因分析 解决方法 收工 百度分享是集成了众多主流第三方网站分享和收藏按钮的工具. 通过百度分享轻松将主流第三方网站的分享按钮 ...