使用Linq根据条件删除重复项

本文关键字:删除 条件 Linq 使用 | 更新日期: 2023-09-27 18:13:59

我的对象是这样的

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查询实现这一点?

使用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)

使用dicinctby from MoreLinqhttp://code.google.com/p/morelinq/

您可以执行以下操作以获得具有PersonID和VersionID唯一组合的新注册列表。

        var list = new List<SignUp>(); ...
        List<SignUp> distinctSignUp = list
            .GroupBy(x => new {x.PersonId, x.VersionId} )
            .Select(y => y.Last())
            .ToList();

我要感谢用户David B在这里给出了精彩的答案:LINQ's Distinct()对特定属性