Distinct<TSource>(IEqualityComparer<TSource> comparer) 根据列名来Distinct

1. DistinctEqualityComparer.cs

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

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

        public bool Equals(T x, T y)
        {
            return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
        }

        public int GetHashCode(T obj)
        {
            return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
        }
    }

2. DistinctExtensions.cs

public static class DistinctExtensions
    {
        public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
        {
            return source.Distinct(new DistinctEqualityComparer<T, V>(keySelector));
        }
    }

3. Program.cs

class Program
    {
        static void Main(string[] args)
        {
            List<Person> personList = new List<Person>(){
                new Person(){Id = 1, Name = "Steven"},
                new Person(){Id = 2, Name = "Steven"},
                new Person(){Id = 3, Name = "Steven"},
                new Person(){Id = 3, Name = "Steven"},
            };

            List<Person> delegateList = personList.Distinct(x => x.Id).ToList();
        }
    }

时间: 2024-10-12 17:07:18

Distinct<TSource>(IEqualityComparer<TSource> comparer) 根据列名来Distinct的相关文章

C#实现 Linq 序列的Distinct—— IEnumerable&lt;T&gt;.Distinct&lt;T&gt;()——IEqualityComparer

简介 在C#中使用List或者Collection的时候,我们经常需要使用到Distinct操作,但是微软默认提供的Distinct重载方法并不能满足我们的需求.这时候,我们就需要自己动手做一番工作了. Distinct方法的重载 Linq的Distinct的方法有如下一个重载版本: public static IEnumerable<TSource> Distinc<TSource>( this IEnumerable<TSource> source, IEquali

C# 中distinct的使用

假设我们有一个类:Product public class Product { public string Id { get; set; } public string Name { get; set; } } Main函数如下: static void Main() { List<Product> products = new List<Product>() { new Product(){ Id="1", Name="n1"}, new

使用Linq中的Distinct方法对序列进行去重操作

使用Linq提供的扩展方法Distinct可以去除序列中的重复元素. 该方法具有以下两种重载形式: (1)public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) (重载1) 通过使用默认的相等比较器对值进行比较并返回序列中的非重复元素. (2)publicstatic IQueryable<TSource> Distinct<TSour

【C#】详解使用Enumerable.Distinct方法去重

Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法: // // 摘要: // 通过使用默认的相等比较器对值进行比较返回序列中的非重复元素. // // 参数: // source: // 要从中移除重复元素的序列. // // 类型参数: // TSource: // source 中的元素的类型. // // 返回结果: // 一个 Syste

Distinct源码分析

以前比较两个List数据,筛选出所需要的数据时候,一直套两层for循环来执行.用到去重(Distinct)的时候,这两个需求其实都是一样的,都是需要比较两个集合,查看了下它的源码,里面确实有值得借鉴的地方. 先附上源码一直我调试的代码,大部分地方加上了注释 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //初始化集合 6 List<Point> points = new List<Point>() 7 { 8

List Except 操作,IEqualityComparer 使用

1.此接口用于对集合 的自定义相等比较算法的实现.包含2个方法: Equals(T,T): 确定指定的对象是否相等. T 为要比较的对象类型: GetHashCode(T) :返回指定对象的哈希代码.如果两个对象的Equal 比较结果相等,则他们hashCode返回的对象也必须返回同一个值: 2. 官方建议继承 EqualityComparer<T> 而不是实现 IEqualityComparer<T> 3. Union() 这个方法将会Union(并集)两个序列(集合)连接成一个

如何很好的使用Linq的Distinct方法

Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name="Test2" 以上list如果直接使用distinct方法进行过滤,仍然返回3条数据,而需要的结果是2条数据.下面给出解这个问题的方法: 方法1: Distinct 方法中使用的相等比较器.这个比较器需要重写Equals和GetHashCode方法,个人不推荐,感觉较麻烦,需要些多余的类,并且用

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

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

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 一贯的风