C# 如何在特定属性上使用Distinct并基于谓词选择要保留的对象?

C# 如何在特定属性上使用Distinct并基于谓词选择要保留的对象?,c#,.net,linq,C#,.net,Linq,我有一个对象的列表。Document类有许多属性,但在这里只有两个相关属性,DocumentLinkId和uploadendate 我要做的是过滤列表,这样就不会有两个Document对象具有相同的DocumentLinkId。当有多个文档对象具有特定的文档LinkId时,我希望保留具有最新的上载数据的对象 我最初的想法是这样做: myDocumentsList.Distinct(d => d.DocumentLinkId).Max(d => d.UploadedOnDate);

我有一个
对象的
列表
Document
类有许多属性,但在这里只有两个相关属性,
DocumentLinkId
uploadendate

我要做的是过滤列表,这样就不会有两个
Document
对象具有相同的
DocumentLinkId
。当有多个
文档
对象具有特定的
文档LinkId
时,我希望保留具有最新的
上载数据的对象

我最初的想法是这样做:

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

但是
Distinct()
不接受谓词。有没有办法用LINQ实现这一点?

您可以通过
DocumentLinkId
对文档进行分组,并为每个组选择具有最新
上载数据的项,如下所示:

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

您可以像中一样使用
DistinctBy

var query=people.DistinctBy(p=>p.Id)

它将类似于:

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

对于您的情况。

您可以定义
IEqualityComparer
的实现。它的存在几乎就是为了这个场景

public class DocumentLinkIdDocumentEqualityComparer : IEqualityComparer<Document>
{
    public bool Equals(Document document1, Document document2)
    {
        return document1.DocumentLinkId == document2.DocumentLinkId;
    }
}
(必须先对其进行编辑以进行排序,以便distinct返回具有最新日期的。)

您的意思是,为了进行这一
Distinct
比较,让我们使用此比较器,并将具有相同
DocumentLinkId
的任意两个文档视为相等


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

尝试按
DocumentLinkId
分组,然后使用max
UploadeData将每个组中的一个进行最大值
UploadeData
始终有一个(老派)选项,可以使用字典作为缓存编写for循环。如果出现任何错误,或者您希望扩展搜索条件等,它可能会运行得最快,并且更易于调试。我认为它应该是
returndocument1.DocumentLinkId==document2.DocumentLinkId需要==是的,谢谢。这就是我直接在答案编辑器中编写代码时发生的情况。这会抛出一个异常消息
方法“First”只能用作最终查询操作。考虑在这个实例中使用方法“FrestSturrest'”。< /代码>:您使用LINQ到实体吗?将
First
替换为
First或default
。在这种情况下,是。这将首先选择一组具有不同
DocumentLinkId
的文档。当它选择它们时,它可能会也可能不会选择最近上传的数据。然后,在创建该集合后,它将只选择一个上载数据最高的文档。所以它不会返回一个不同的集合。它返回一个对象。你说得对@ScottHannen我已更新了我的答案,以选择列表中的条目,首先按UploadeNode排序,然后按DocumentLinkId选择不同的条目