Linq 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去重方法之一相关推荐
- linq distinct 不够用了!
问题引出:在实际中遇到一个问题,要进行集合去重,集合内存储的是引用类型,需要根据id进行去重.这个时候linq 的distinct 就不够用了,对于引用类型,它直接比较地址.测试数据如下: class ...
- oracle 数据去重方法
1. 创建表: -- Create table create table TEST_USER (user_id NUMBER(3),user_name VARCHAR2(20),user_age NU ...
- 数组去重以及数组对象去重方法总结
数组去重以及数组对象去重方法总结 一.数组对象去重 1.reduce方法 2.利用原生js+空对象+空数组 3.利用原生js+标志位+空数组 4.利用双指针思想+splice方法 二.数组去重 1.利 ...
- 大数据Spark面试,distinct去重原理,是如何实现的
最近,有位朋友问我,distinct去重原理是怎么实现的? "在面试时,面试官问他了解distinct算子吗?" "了解啊,Spark的rdd,一种transFormat ...
- java string 连续字符_Java中字符串中连续相同字符去重方法
导读 正文 最近参加了一个面试,问到了如何在一个字符串中连续相同字符去重,想了想用正则表达式应该可以轻松实现.可是由于长时间没有编码了,而且由于原先的工作用到的比较少.具体的自己就不会写正则表达式用到 ...
- Linq Distinct扩展
前言 问题描述:Person类有两个属性ID(int).Name(string)属性.筛选序列中不重复的Person. 1: public class Person 2: { 3: public in ...
- 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等案例之详细攻略 ...
- php 文件扫描去重,PHP中的去重方法详解和文件下载
本文主要和大家分享PHP中的去重方法详解和文件下载,在php中文件导入过程中,经常会遇到重复事件,那么就需要我们去重,然后进行下载. 1.思想 先设置一个存储主键数组,和一个空数组.解析文件,然后看要 ...
- LINQ中ForEach方法的使用
标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载.LINQ中For ...
最新文章
- bzoj 4771: 七彩树 树链的并+可持久化线段树
- PHPUnit单元测试 - 我看过的PHP开源框架
- PyQt - 维基百科,自由的百科全书
- MyBatis-Spring配置简单了解
- oracle 提取首字母,oracle 取字段文字拼音首字母
- Hinton神经网络公开课编程练习3 Optimization and generalization
- virtualenv在Ubuntu18.10(64位)中的用法(命令和图形化建立虚拟环境)
- 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据
- 递归函数时间复杂度分析
- jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
- Code-First Development with Entity Framework 4
- java dom4j 读取 xml_java使用dom4j读取xml示例
- vue通过链接显示服务器上的图片_图片网站该如何做SEO优化?详细讲解图片优化技巧...
- Attaching the Script debugger to process ‘[****]’ on machine **** failed.
- win7修复计算机卡了,win7系统下360补丁修复过程中卡住的解决方法
- Eclipse中文版汉化教程(详细图解)
- 新西兰大学计算机,新西兰大学计算机排名
- 【H2O系列001】H2O概述
- 中兴笔试题目及答案(软件开发工程师)
- (rear + maxSize - front) % maxSize 公式的理解