如何查找重复项并保留后来的条目
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();
我有两个来自不同来源的对象列表,如下所示:
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();