我有一个Document
对象的List
。Document
类有许多性质,但这里只涉及DocumentLinkId
和UploadedOnDate
这两个性质。
我想做的是过滤列表,所以没有两个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);