小编典典

LINQ 在特定属性上的 Distinct()

all

我正在使用 LINQ 来了解它,但是Distinct当我没有简单的列表时,我不知道如何使用(简单的整数列表很容易做到,这不是问题)。如果想在对象的
一个 ​​或 多个
属性的对象列表上使用Distinct怎么办?


示例:如果一个对象是Person, 具有 Property Id。如何获取所有 Person
并将Distinct其与对象的属性一起使用Id

Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

我怎样才能得到公正Person1Person3?那可能吗?

如果 LINQ 无法实现,那么Person根据 .NET 3.5 中的某些属性列出列表的最佳方法是什么?


阅读 112

收藏
2022-02-25

共1个答案

小编典典

编辑 :这现在是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构造函数。

2022-02-25