LINQ的Distinct总结

简介:

LINQ命名空间下的Distinct方法有两个重载,一个是对TSource的Queryable可查询结果集支持的,别一个是只对T的IList,Enumerable结果集支持的

看一下,如果是返回为iqueryable<T>结果集,只能用distinct()默认的方法,

如果是List<T>,就可以根据自己定义好的比较原则,进行字段级的过滤了

例如,可以对Person类,进行ID,与Name的相等来确实整个对象是否与其它实例对象相等:

 public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
    }

    public class PersonCompar : System.Collections.Generic.IEqualityComparer<Person>
    {
        public bool Equals(Person x, Person y)
        {
            if (x == null)
                return y == null;
            return x.ID == y.ID;
        }
        public int GetHashCode(Person obj)
        {
            if (obj == null)
                return 0;
            return obj.ID.GetHashCode();
        }
    }

如果一个list<person>的实例为

personList,那么,它根据ID过滤的程序为

 personList.Distinct(new PropertyComparer<Person>("ID")).ToList().ForEach(i => Console.WriteLine(i.ID + i.Name));

 

PropertyComparer.cs代码如下

 /// <summary>
    /// 属性比较器
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class PropertyComparer<T> : IEqualityComparer<T>
    {

        private PropertyInfo _PropertyInfo;
        /// <summary>
        /// 通过propertyName 获取PropertyInfo对象        /// </summary>
        /// <param name="propertyName"></param>
        public PropertyComparer(string propertyName)
        {
            _PropertyInfo = typeof(T).GetProperty(propertyName,
            BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);
            if (_PropertyInfo == null)
            {
                throw new ArgumentException(string.Format("{0} is not a property of type {1}.",
                    propertyName, typeof(T)));
            }
        }
        #region IEqualityComparer<T> Members
        public bool Equals(T x, T y)
        {
            object xValue = _PropertyInfo.GetValue(x, null);
            object yValue = _PropertyInfo.GetValue(y, null);
            if (xValue == null)
                return yValue == null;
            return xValue.Equals(yValue);
        }
        public int GetHashCode(T obj)
        {
            object propertyValue = _PropertyInfo.GetValue(obj, null);
            if (propertyValue == null)
                return 0;
            else
                return propertyValue.GetHashCode();
        }
        #endregion

    }

本文转自博客园张占岭(仓储大叔)的博客,原文链接:LINQ的Distinct总结,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
SQL 开发框架 .NET
C#进阶-LINQ表达式之GroupBy分组查询
本篇文章我们将演示LINQ扩展包基础语法里的GroupBy分组查询,并实现投影等实际操作中常用的类型转换手法。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
297 0
|
存储 .NET C#
C# LINQ 详解 From Where Select Group Into OrderBy Let Join
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述     LINQ的全称是Language Integrated Query,中文译成“语言集成查询”。
2127 0
|
自然语言处理 .NET
Linq使用Group By
1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:Linq使用Group By按CategoryID划分产品。
3941 0
|
.NET 开发框架 存储
|
.NET 开发框架 数据库
深入调研Linq to Objects Join Linq to Entity
最近工作中遇到数据库组合查询带来的一些问题,因此有必要调研一下Linq to Objects Join Linq to Entity。参考一些网友的代码案例,深入实践了一下使用EntityFramework Code First 下的组合查询。
1254 0