发布日期:2018-03-26
LINQ的Distinct()在特定属性上的使用+ 查看更多
LINQ的Distinct()在特定属性上的使用
+ 查看更多
发布日期:2018-02-23 10:27
分类:C#
浏览次数:181
我正在使用LINQ来了解它,但是当我没有一个简单的列表(简单的整数列表很容易做,这不是问题)时,我不知道如何使用Distinct。 我想如何在对象的一个或多个属性的对象列表上使用Distinct?
示例:如果一个对象是Person,具有Property Id。 如何使用对象的属性Id获取所有人并对其使用不同之处?
Person1:Id = 1,Name =“Test1”
Person2:Id = 1,Name =“Test1”
Person3:Id = 2,Name =“Test2”
Person2:Id = 1,Name =“Test1”
Person3:Id = 2,Name =“Test2”
我如何才能获得Person1和Person3?
如果LINQ是不可能的,根据.NET 3.5中的一些属性,有什么是Person的列表的最佳方式?
回答:
你需要的是有效的“distinct-by”。 我不相信它是LINQ的一部分,尽管它写得很容易:
public static IEnumerableDistinctBy (this IEnumerable source, Func keySelector) { HashSet seenKeys = new HashSet (); foreach (TSource element in source) { if (seenKeys.Add(keySelector(element))) { yield return element; } } }
使用id属性找到distinct值:
var query = people.DistinctBy(p => p.Id);
并且要使用多个属性,可以使用匿名类型来实现相等的实现:
var query = people.DistinctBy(p => new { p.Id, p.Name });
未测试,但它应该可以(至少可以编译)。
它假定键的默认比较器 - 如果要传递一个等式比较器,只需将其传递给HashSet构造函数。