我的对象是这种形式
List<SignUp>
class SignUp
{
public int Id { get ; set;}
public int VersionId { get ; set;}
public int PersonId{ get ; set;}
public DateTime? SignUpDate { get ; set;}
}
人们注册了一个文档版本。有些版本永远不会被存档,他们每年都必须辞职。 所以我最终得到了这样的记录
SignUp s = new SignUp { Id = 1, VersionId = 1, PersonId = 5}
SignUp s2 = new SignUp { Id = 2, VersionId = 2, PersonId = 5}
SignUp s3 = new SignUp { Id = 3, VersionId = 1, PersonId = 5}
没有这个包含 s、s2、s3 的列表在 personId、versionId 组合上有 2 个重复项,它们是 s 和 s3。唯一的问题是 s3 的 ID 比 s 高。 因此,我想消除 s 并只显示 s2、s3(s 是旧版本,我忽略它)
如果可能,如何使用 linq 查询来实现?
最佳答案
怎么样:
List<SignUp> signups = ...
var filteredSignups = from signup in signups
group signup by new { signup.PersonId, signup.VersionId }
into pvIdGroup
select pvIdGroup.OrderBy(groupedSignUp => groupedSignUp.Id)
.Last();
想法是根据两个属性对项目进行分组,然后从每组中选择“最佳”项目。
如果您不希望对每个组中的项目进行低效排序,请考虑使用 O(n) MaxBy
方法,例如 morelinq 中的方法.
然后 select
变成:
select pvIdGroup.MaxBy(groupedSignUp => groupedSignUp.Id)
关于c# - 使用 Linq 根据条件删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081645/