如何很好的使用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&lt;T&gt; 类型的某个变量上调用它。 @shwan 请给我留言,这很重要(maythamfahmi@itbackyard.com) 【参考方案1】:

只需通过电子邮件分组并获取每个组中的第一个(删除重复项),最后将其转换为可查询(这里我假设 ListArray,...名称是列表):

var result = list.GroupBy(x => x.email).Select(g => g.First()).AsQueryable();

【讨论】:

非常感谢!它奏效了,它为我节省了太多解决解决方案的工作。

以上是关于如何很好的使用Linq的Distinct方法的主要内容,如果未能解决你的问题,请参考以下文章

如何很好的使用Linq的Distinct方法

c# linq Distinct 过滤重复项怎么做啊

Linq distinct 方法仅适用于特定属性[重复]

System.Linq Distinct 方法使用

有没有一种很好的 LINQ 方法来做笛卡尔积?

如何在LINQ中找到`Distinct`记录?