我正在使用 LINQ 来了解它,但是Distinct当我没有简单的列表时,我不知道如何使用(简单的整数列表很容易做到,这不是问题)。如果想在对象的 一个 或 多个 属性的对象列表上使用Distinct怎么办?
Distinct
示例:如果一个对象是Person, 具有 Property Id。如何获取所有 Person 并将Distinct其与对象的属性一起使用Id?
Person
Id
Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name="Test2"
我怎样才能得到公正Person1和Person3?那可能吗?
Person1
Person3
如果 LINQ 无法实现,那么Person根据 .NET 3.5 中的某些属性列出列表的最佳方法是什么?
编辑 :这现在是MoreLINQ的一部分。
你需要的是一个有效的“distinct-by”。我不相信它是 LINQ 的一部分,尽管它很容易编写:
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.Add(keySelector(element))) { yield return element; } } }
因此,要仅使用该属性来查找不同的值Id,您可以使用:
var query = people.DistinctBy(p => p.Id);
要使用多个属性,您可以使用匿名类型,它们适当地实现相等:
var query = people.DistinctBy(p => new { p.Id, p.Name });
未经测试,但它应该可以工作(现在至少可以编译)。
它假定键的默认比较器 - 如果您想传入相等比较器,只需将其传递给HashSet构造函数。
HashSet