如何在特定属性上使用Distinct并根据谓词选择要保留的对象



我有一个Document对象的ListDocument类有许多性质,但这里只涉及DocumentLinkIdUploadedOnDate这两个性质。

我想做的是过滤列表,所以没有两个Document对象具有相同的DocumentLinkId。当有多个Document对象具有特定的DocumentLinkId时,我想保留具有最新UploadedOnDate的那个。

我最初的想法是这样的:

myDocumentsList.Distinct(d => d.DocumentLinkId).Max(d => d.UploadedOnDate);

但是Distinct()不带谓词。有办法做到这一点与LINQ吗?

您可以按DocumentLinkId对文档进行分组,对于每一组,选择具有最新UploadedOnDate的项目,如下所示:

var result = myDocumentsList
    .GroupBy(d => d.DocumentLinkId)
    .Select(g => g.OrderByDescending(d => d.UploadedOnDate).First())
    .ToList();

您可以定义IEqualityComparer<Document>的实现。它几乎完全适用于这种情况。

public class DocumentLinkIdDocumentEqualityComparer : IEqualityComparer<Document>
{
    public bool Equals(Document document1, Document document2)
    {
        return document1.DocumentLinkId == document2.DocumentLinkId;
    }
}

然后你可以这样做:

myDocumentsList.OrderByDescending(d => d.UploadedOnDate)
    .Distinct(new DocumentLinkIdDocumentEqualityComparer())

(必须先编辑这个排序,以便distinct返回具有最近日期的那个)

你是说为了这个Distinct比较的目的,让我们使用这个比较器,就好像任何两个具有相同DocumentLinkId的文档都是相等的。

这样做的好处是,你不必修改Document来覆盖Equals,特别是因为这个特定的相等比较可能并不适用于所有情况。这允许您指定何时要使用特定的自定义相等比较。

您可以在这个问题中使用DistinctBy

var query = people。DistinctBy(p => p. id);

应该是这样的:

myDocumentsList.OrderByDescending(x => x.UploadedOnDate).ToList().DistinctBy(d => d.DocumentLinkId).Max(d => d.UploadedOnDate);

相关内容

  • 没有找到相关文章

最新更新