[LINQ].NET/C#应用程序编程开发中使用Linq数据表中基于一个字段去重的查询应该如何实现呢?

.NET 作者: Rector 108阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在.NET/C#应用程序编程开发中,如果我们需要使用LinqDistinct()方法查询数据表中根据某一个字段进行去重的数据(即:查询数据表中不重复的数据),应该如何实现呢?

我们知道,直接使用Distinct()方法会根据所有字段进行去重,如下:

var query = (from r in table1
orderby r.Text
select r).distinct();

如上例中的查询,实现如何按照’Text’一个字段去重呢?

方案一

使用LinqGroupBy()方法,如下:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

此方法首先会根据 Text 字段进行分组,然后从每个分组中选择第一条数据,所以查询出来的数据的 Text 的值是不重复的。

方案二

使用第三方的扩展组件 [MoreLINQ][1]MoreLINQ 组件扩展了去重的方法 DistinctBy(),使用示例如下:

var results = table1.DistictBy(row => row.Text);

DistinctBy() 方法源码的实现代码如下:

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

方案三

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

阅读了该文章的人还浏览了...

本文永久链接码友网 » [LINQ].NET/C#应用程序编程开发中使用Linq数据表中基于一个字段去重的查询应该如何实现呢?

发布于: 2018-06-24 20:47:00
分享扩散: