首页 / .NET / 正文

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

2626 发布于: 2018-06-24 读完约需4分钟

问题描述

在.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());

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [Entity Framework].NET/C#应用程序编程开发中使用Entity Framework Code First如何配置小数类型的精度范围(Decimal and scale)?

下一篇: [LINQ].NET/C#应用程序编程开发中如何使用Linq将一个集合转换成值为集合的字典?

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

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册