首页 / C#开发 / 正文

[LINQ].NET/C#应用程序编程开发中使用LINQ如何从一个集合(List)中查询不重复的值?

2172 1 发布于: 2018-07-24 读完约需4分钟

问题描述

在.NET/C#应用程序编程开发中,假设当前有如下的实体类:

class obj
{
    int typeID; //可能的值有0-9,一共10种可能 
    string uniqueString; //不重复的字符串
}

其中,obj类中的typeID属性可能的值有0-9,一共10种可能 ,uniqueString属性的值是惟一的、不重复的字符串

现在假设有一个集合List<obj>,此集合中有100个元素,但typeID不重复的值只是10个,在.NET/C#应用程序编程开发中,是否有可能使用LINQ获取这不重复的10个值,如果可以,又应该如何实现呢?

方案一

使用LINQ的扩展方法Distinct()实现,如下:

objList.Select(o=>o.typeId).Distinct()

方案二

使用MoreLINQDistinctBy()方法实现去重的,如下:

var distinct = list.DistinctBy(x => x.typeID);

或者使用LINQ的扩展方法GroupBy()实现,如下:

var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First());

如果为了可重用,我们还可以封装成一个静态的扩展方法,如下:

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.Contains(keySelector(element)))
        {
            seenKeys.Add(keySelector(element));
            yield return element;
        }
    }
}

调用示例:

var query = objs.DistinctBy(p => p.TypeId);

多个属性去重:

var query = objs.DistinctBy(p => new { p.TypeId, p.Name });

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

上一篇: [LINQ].NET/C#应用程序编程开发中如何将多表内连接的SQL转换成对应的LINQ查询?

下一篇: # [LINQ].NET/C#应用程序编程开发中使用LINQ如何判断/检查一个集合(List<string>)中是否有重复的元素?

本文永久链接码友网 » [LINQ].NET/C#应用程序编程开发中使用LINQ如何从一个集合(List)中查询不重复的值?

分享扩散:

发表评论

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