问题描述
在.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()
方案二
使用MoreLINQ
的DistinctBy()
方法实现去重的,如下:
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 });
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册