linq distinct去重
类别:编程学习 浏览量:3129
时间:2015-8-2 linq distinct去重
linq distinct去重一、使用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方法
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实现去重
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);
标签:linq
您可能感兴趣
- Linq中where查询
- linq中join用法
- linq 排序
- Linq中的TakeWhile和SkipWhile
- 使用 LINQPad 调试linq以及lambda表达式
- linq not in 查询
- LINQ TO SQL 中join
- linq中group by
- linq to sql 中Concat、Union、Intersect、Except
- list使用linq排序
- linq中let
- Linq操作Datable
- linq中AsEnumerable和AsQueryable的区别
- LINQ中Aggregate的用法
- datatable linq查询
- linq中延迟执行
- 一课译词 放鸽子(一课译词放鸽子)
- 终于来了,淘宝更改账户名测试中,快去看看你能不能修改(淘宝更改账户名测试中)
- 淘宝支持账号名修改,网友 终于可以 重新做人 了(淘宝支持账号名修改)
- 盘点那些年让人称奇的年终奖 最后一个赢辣条毫无悬念(盘点那些年让人称奇的年终奖)
- 你还没有升职吗 他竟因为几套激励理论,升职了(你还没有升职吗)
- 某知名企业绩效管理体系及薪酬分配体系操作手册(某知名企业绩效管理体系及薪酬分配体系操作手册)
热门推荐
- css进度条怎么设置(使用CSS实现阅读进度条)
- dedecms怎样快速找到图片位置(dede搬家后路径变化批量替换图片路径避免图片不能正常显示)
- laravel查询限制输出设置(laravel 获取某个查询的查询SQL语句方法)
- 面向对象设计中的单一职责原则
- html5关闭页面代码(HTML5页面无缝闪开的问题及解决方案)
- thinkphp5框架怎么设置(thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例)
- tomcat处理高并发请求(Tomcat打破双亲委派机制实现隔离Web应用的方法)
- mysql limit越大越慢(MySQL limit分页大偏移量慢的原因及优化方案)
- python画图教程(详解用Python练习画个美队盾牌)
- html5socket源码(五分钟学会HTML5的WebSocket协议)