如何查找重复项并保留后来的条目

How to find duplicates and preserve the later entry

我有两个来自不同来源的对象列表,如下所示:

public class PersonToolDto {
   public int PersonId { get; set; }

   public int ToolId { get; set; }

   public DateTime CreatedAt { get; set; }
}

var personToolListFromSomeSource = new List<PersonToolDto>{
     new PersonTool{1, 1, 2021-07-07},
     new PersonTool{2, 1, 2021-07-07},
     new PersonTool{3, 1, 2021-07-07},
}

var personToolListFromAnotherSource = new List<PersonToolDto>{
     new PersonTool{1, 1, 2021-06-07},
     new PersonTool{2, 1, 2021-07-07},
     new PersonTool{3, 1, 2021-07-07},
}

我想删除重复项,只保留最新的条目。 linq 或其他实现此目的的简单快速方法是什么?按一个人的 id 进行简单的分组并不能消除重复项,我有点不知道如何比较日期。

我想保留结构并继续列表。

您可以执行以下操作:

var withoutDuplicates = personToolListFromSomeSource
    .Concat(personToolListFromAnotherSource)
    .GroupBy(p => new { p.PersonId, p.ToolId })
    .Select(g => g.OrderByDescending(x => x.CreatedAt).First())
    .ToList();

对于即将推出的 .NET 6,您还可以使用新的 DistinctBy:

var output = personToolListFromSomeSource
    .Concat(personToolListFromAnotherSource)
    .OrderByDescending(x => x.CreatedAt)
    .DistinctBy(x => x.PersonId)
    .ToList(); 

.NET 6 也有一个MaxBy,所以另一个选项是:

var output = personToolListFromSomeSource
    .Concat(personToolListFromAnotherSource)
    .GroupBy(x => x.PersonId, (k,v) => v.MaxBy(x => x.CreatedAt))    
    .ToList();