var result = query.Distinct().ToList();
List<DeliveryOrderViewModel> dov = result.GroupBy( p => new {p.SAP_DeliveryOrderID}).Select( g => g.First()).ToList();
return dov;一、使用Distinct()扩展方法去重
 
实例:根据Id去重
错误的方式

List<Product> products = new List<Product>()
    {
        new Product(){ Id="1", Name="n1"},
        new Product(){ Id="1", Name="n2"},
        new Product(){ Id="2", Name="n1"},
        new Product(){ Id="2", Name="n2"},
    };

var distinctProduct = products.Distinct();

返回4条数据,因为Distinct 默认比较的是Product对象的引用
 
正确的方式
新建类ProductIdComparer,继承 IEqualityComparer<Product>,实现Equals方法
 
 
C# 代码   复制

public class ProductIdComparer : IEqualityComparer<Product>
{
    public bool Equals(Product x, Product y)
    {
        if (x == null)
            return y == null;
        return x.Id == y.Id;
    }

public int GetHashCode(Product obj)
    {
        if (obj == null)
            return 0;
        return obj.Id.GetHashCode();
    }
}
 
使用的时候,只需要

var distinctProduct = allProduct.Distinct(new ProductIdComparer());
 
备注:现在假设我们要 按照 Name来筛选重复呢?则需要再添加一个类ProductNameComparer.
 
二、使用GroupBy方式去重
对需要Distinct的字段进行分组,取组内的第一条记录这样结果就是Distinct的数据了。
例如

List<Product> distinctProduct = allProduct

.GroupBy(p => new {p.Id, p.Name} )

.Select(g => g.First())

.ToList();

三、通过自定义扩展方法DistinctBy实现去重
 
 
C# 代码   复制

public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)

{

HashSet<TKey> seenKeys = new HashSet<TKey>();

foreach (TSource element in source)

{

if (seenKeys.Add(keySelector(element)))

{

yield return element;

}

}

}

方法的使用
1、针对ID,和Name进行Distinct
var query = allProduct.DistinctBy(p => new { p.Id, p.Name });
2、仅仅针对ID进行distinct:
var query = allProduct.DistinctBy(p => p.Id);

转载于:https://www.cnblogs.com/jhxk/articles/9789336.html

Linq distinct去重方法之一相关推荐

  1. linq distinct 不够用了!

    问题引出:在实际中遇到一个问题,要进行集合去重,集合内存储的是引用类型,需要根据id进行去重.这个时候linq 的distinct 就不够用了,对于引用类型,它直接比较地址.测试数据如下: class ...

  2. oracle 数据去重方法

    1. 创建表: -- Create table create table TEST_USER (user_id NUMBER(3),user_name VARCHAR2(20),user_age NU ...

  3. 数组去重以及数组对象去重方法总结

    数组去重以及数组对象去重方法总结 一.数组对象去重 1.reduce方法 2.利用原生js+空对象+空数组 3.利用原生js+标志位+空数组 4.利用双指针思想+splice方法 二.数组去重 1.利 ...

  4. 大数据Spark面试,distinct去重原理,是如何实现的

    最近,有位朋友问我,distinct去重原理是怎么实现的? "在面试时,面试官问他了解distinct算子吗?" "了解啊,Spark的rdd,一种transFormat ...

  5. java string 连续字符_Java中字符串中连续相同字符去重方法

    导读 正文 最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到 ...

  6. Linq Distinct扩展

    前言 问题描述:Person类有两个属性ID(int).Name(string)属性.筛选序列中不重复的Person. 1: public class Person 2: { 3: public in ...

  7. Database之SQLSever:SQL命令实现四则运算、desc降序、like模糊查询、distinct去重、MAX/MIN/SUM/AVG/COUNT/GROUP/having等案例之详细攻略

    Database之SQLSever:SQL命令实现四则运算.desc降序.like模糊查询.distinct去重.MAX/MIN/SUM/AVG/COUNT/GROUP/having等案例之详细攻略 ...

  8. php 文件扫描去重,PHP中的去重方法详解和文件下载

    本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...

  9. LINQ中ForEach方法的使用

    标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载.LINQ中For ...

最新文章

  1. bzoj 4771: 七彩树 树链的并+可持久化线段树
  2. PHPUnit单元测试 - 我看过的PHP开源框架
  3. PyQt - 维基百科,自由的百科全书
  4. MyBatis-Spring配置简单了解
  5. oracle 提取首字母,oracle 取字段文字拼音首字母
  6. Hinton神经网络公开课编程练习3 Optimization and generalization
  7. virtualenv在Ubuntu18.10(64位)中的用法(命令和图形化建立虚拟环境)
  8. 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据
  9. 递归函数时间复杂度分析
  10. jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
  11. Code-First Development with Entity Framework 4
  12. java dom4j 读取 xml_java使用dom4j读取xml示例
  13. vue通过链接显示服务器上的图片_图片网站该如何做SEO优化?详细讲解图片优化技巧...
  14. Attaching the Script debugger to process ‘[****]’ on machine **** failed.
  15. win7修复计算机卡了,win7系统下360补丁修复过程中卡住的解决方法
  16. Eclipse中文版汉化教程(详细图解)
  17. 新西兰大学计算机,新西兰大学计算机排名
  18. 【H2O系列001】H2O概述
  19. 中兴笔试题目及答案(软件开发工程师)
  20. (rear + maxSize - front) % maxSize 公式的理解

热门文章

  1. python中星号变量的几种特殊用法
  2. 11.1 JavaScript介绍
  3. 【Qt】水平和垂直布局
  4. 【STM32】独立看门狗相关函数和类型
  5. 【Linux】一步一步学Linux——kill命令(124)
  6. 【C++】C++虚函数表详细分析(下)
  7. 51nod 1785 数据流中的算法 (方差计算公式)
  8. 每天一道LeetCode-----重新实现开方运算sqrt(x),只返回整数部分即可
  9. c语言中oxb0常量是什么意思,C语言练习库V1.0
  10. 剑指offer--整数中1出现的次数