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