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

C#开发 作者: Rector 244阅读 0评论 0收藏 收藏本文

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

问题描述

在.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#应用程序编程开发中使用LINQ如何从一个集合(List)中查询不重复的值?

发布于: 2018-07-24 08:53:40
分享扩散: