如何很好的使用Linq的Distinct方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何很好的使用Linq的Distinct方法相关的知识,希望对你有一定的参考价值。
参考技术A 自己扩展一个DistinctBy。这个扩展方法还是很不错的,用起来很简洁,适合为框架添加的Distinct扩展方法。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;
使用方法如下(针对ID,和Name进行Distinct):
var query = people.DistinctBy(p => new p.Id, p.Name );
若仅仅针对ID进行distinct:
var query = people.DistinctBy(p => p.Id);
方法2:通过GroupBy分组后,并取出第一条数据。简单易用,很方便。这是一种迂回策略,代码理解起来没有Distinct表意清晰,虽然实现了效果。
List<Person> distinctPeople = allPeople
.GroupBy(p => new p.Id, p.Name )
.Select(g => g.First())
.ToList();
使用 Distinct() 过滤 Linq 中的重复记录
【中文标题】使用 Distinct() 过滤 Linq 中的重复记录【英文标题】:Using Distinct() for filtering duplicated records in Linq 【发布时间】:2019-04-04 21:22:29 【问题描述】:我有一些重复的电子邮件记录。我还需要返回IQueryable
类型。
我尝试了Distinct()
,但我没有为我工作,因为我想返回IQueryable
类型。我收到一个错误,无法将类型系统集合泛型列表隐式转换为 System.Linq.IQueryable
(您是否缺少演员表):
public IQueryable<acadVParent> GetEmailReceiptsId()
return AsQueryable().Where(o => (o.email != null && o.email != ""));
所以这在集合中重复了电子邮件。我想排除具有重复电子邮件记录的对象记录。
【问题讨论】:
您使用的AsQueryable
静态定义在哪里?
你在AsQueryable
之前有什么遗漏吗?
嗨,Shwan,欢迎来到 SO。 AsQueryable
是您创建的某种方法吗?如果有,源头在哪里?否则,我认为您提供的示例代码不会编译。如果您尝试从 Linq 引用 IQueryable
扩展方法,那么应该在 IEnumerable<T>
类型的某个变量上调用它。
@shwan 请给我留言,这很重要(maythamfahmi@itbackyard.com)
【参考方案1】:
只需通过电子邮件分组并获取每个组中的第一个(删除重复项),最后将其转换为可查询(这里我假设 List
或 Array
,...名称是列表):
var result = list.GroupBy(x => x.email).Select(g => g.First()).AsQueryable();
【讨论】:
非常感谢!它奏效了,它为我节省了太多解决解决方案的工作。以上是关于如何很好的使用Linq的Distinct方法的主要内容,如果未能解决你的问题,请参考以下文章