首先,我们定义一个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. [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型、视图、控制器、路由等的基本操作

    [.net 面向对象程序设计深入](6).NET MVC 6 —— 模型.视图.控制器.路由等的基本操作 1. 使用Visual Studio 2015创建Web App (1)文件>新建> ...

  2. 測試大型資料表的 Horizontal Partitioning 水平切割

    FileGroup 檔案群組 :一個「資料庫(database)」可對應一或多個 FileGroup,一個 FileGroup 可由一或多個 file (.ndf) 構成. FileGroup 可讓 ...

  3. 过段时间逐步使用HTML5新增的web worker等内容

    想来快2017年了,2013年前的手机应该很少有人用了,以后逐渐使用HTML5新增的高级API吧. 先把web worker的内容再熟悉一下,因为微软虚拟学院的'面向有经验开发人员的 JavaScri ...

  4. 仿h5拖拽

    在h5中有个拖拽的声明式命令,就如html属性一样,简单强大. 而在网页上拖拽的功能还是需求很大的,所以对这方面应该去仔细了解一下. 所以仿一一下它的实现.只是仿了它的复制一份到目标容器的功能.它还有 ...

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

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

  6. Disk IO Performance

    一,使用 Performance counter 监控Disk IO问题 1,Physical Disk vs. Logical Disk Windows可以在一个Physical Disk上划出若干 ...

  7. Effective Modern C++ 42 Specific Ways to Improve Your Use of C++11 and C++14

    Item 1: Understand template type deduction. Item 2: Understand auto type deduction. Item 3: Understa ...

  8. 深入理解脚本化CSS系列第五篇——动态样式

    前面的话 很多时候,DOM操作比较简单明了,因此用javascript生成那些通常原本是HTML代码生成的内容并不麻烦.但由于浏览器充斥着隐藏的陷阱和不兼容问题,处理DOM中的某些部分时要复杂一些,比 ...

  9. JAVA服务器搭建之问题总结

    负责维护公司产品的web服务器搭建与维护,最近遇到一下状况,今天在这里简单总结一下,希望对于刚刚一些刚入行的小伙伴有所帮助,避免再走弯路. 第一点:Tomcat内存设置: 一.常见的Java内存溢出有 ...

  10. 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...