linq Distinct 去除重复数据

转载:http://www.cnblogs.com/ldp615/archive/2011/08/01/distinct-entension.html

只可惜linq默认不支持.Distinct(p => p.ID);

试想如果能写成下面的样子,是不是更简单优雅:

var p1 = products.Distinct(p => p.ID);
var p2 = products.Distinct(p => p.Name);

使用一个简单的 lambda 作为参数,也符合 Linq 一贯的风格。

扩展方法:

public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector,
    IEqualityComparer<V> comparer = EqualityComparer<V>.Default)
{
    return source.Distinct(new CommonEqualityComparer<T, V>(keySelector, comparer));
}
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Linq;

public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
    private Func<T, V> keySelector;
    private IEqualityComparer<V> comparer;

    public CommonEqualityComparer(Func<T, V> keySelector, IEqualityComparer<V> comparer)
    {
        this.keySelector = keySelector;
        this.comparer = comparer;
    }

    public CommonEqualityComparer(Func<T, V> keySelector)
        : this(keySelector, EqualityComparer<V>.Default)
    {  }

    public bool Equals(T x, T y)
    {
        return comparer.Equals(keySelector(x), keySelector(y));
    }

    public int GetHashCode(T obj)
    {
        return comparer.GetHashCode(keySelector(obj));
    }
}
时间: 2024-10-11 12:55:09

linq Distinct 去除重复数据的相关文章

自定义通用Distinct去除重复数据

由于Lambda Distinct方法默认是按照集合里面的值比较的,所以当集合里面存放的是类的时候,我们一般是按照实体中的某一属性值比较,其实是用默认的Distinct也可以的,自己先定义一个实现了接口IEqualityComparer的类,然后调用Distinct的重载将这个类传递进去,但是这样太麻烦了,而且不能重用 所以参考了一些资料 整了一个程序员最爱的通用的方法 代码如下: 1.先定义比较类实现IEqualityComparer public class CommonEqualityCo

SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 order by用在表名的后面 order by后面就填你要按它排序的字段,是升序排序(从小到大排序) percent:百分比 %=percent 比如要显示5%的数据处理,不能写top 5%,而是top 5 percent 提示:如果top 5 percent出来的数是3.1条数据的话,是取四条数据,而不

数据检索,top,Distinct去除重复记录

--数据检索--语法:--select 字段列表/* from 表列表 where 条件----查询所有学员信息select * from student--带条件的查询select * from Student where Sex='女'select * from Student where Sex='男'--查询指定的列select StudentNo,StudentName,Sex,Address,Phone from Student--设置查询 结果集--虚拟表 的列名称select S

mysql 去除重复数据 语句

纠结的过程: mysql> select * from role group by role_name,deleted; +---------+-----------+---------+ | role_id | role_name | deleted | +---------+-----------+---------+ | 2 | xue | 12 | | 1 | zhao | 12 | | 3 | zhao | 13 | +---------+-----------+---------+

按天去除重复数据,为0则取0,否则取最大的那个值

测试数据: mysql> select * from t2; +----+--------+---------------------+------------+ | id | userid | inputDate | infoStatus | +----+--------+---------------------+------------+ | 1 | 1 | 2014-07-11 00:00:00 | 20013 | | 2 | 1 | 2014-07-11 00:00:00 | 0 |

List集合去除重复数据

[转自]Java中List集合去除重复数据的方法 1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); }

Linq使用Distinct删除重复数据时如何指定所要依据的成员属性zz

最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时,就必需绕一下路,这边稍微将处理的方法做个整理并记录一下. 首先为了方便接下去说明,我们必须先来准备后面会用到的数据类别,这边一样用笔者最常用来示范的Person类别,内含两个成员属性ID与Name. view source print? 01.public struct Person 02.{ 03

Distinct删除重复数据时 自定义的方法比较【转】

最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时,就必需绕一下路,这边稍微将处理的方法做个整理并记录一下. 首先为了方便接下去说明,我们必须先来准备后面会用到的数据类别,这边一样用笔者最常用来示范的Person类别,内含两个成员属性ID与Name. 01.public struct Person 02.{ 03.#region Property 0

List&lt;T&gt; 去除重复数据

//原数据 List<T_Model> tmpListAll=new List<T_Model>(); //去除集合中重复数据后 List<T_Model> tmpList = tmpListAll.Distinct(new AutoFilterParmsCompare()).ToList(); /// <summary> /// 比较器 /// </summary> public class AutoFilterParmsCompare : E