问题描述
在.NET/C#应用程序编程开发中,如果我们需要使用Linq
的Distinct()
方法查询数据表中根据某一个字段进行去重的数据(即:查询数据表中不重复的数据),应该如何实现呢?
我们知道,直接使用Distinct()
方法会根据所有字段进行去重,如下:
var query = (from r in table1
orderby r.Text
select r).distinct();
如上例中的查询,实现如何按照’Text’一个字段去重呢?
方案一
使用Linq
的GroupBy()
方法,如下:
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());
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册