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

时间:2011-11-10 15:08:20

标签: c# linq generics

我的对象是这种形式

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&amp; S3。唯一的事情是s3的Id比s高。 因此我想消除s并只显示s2,s3(s是旧版本,我忽略它)

如果可能,如何使用linq查询来实现?

3 个答案:

答案 0 :(得分:5)

怎么样:

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)

答案 1 :(得分:1)

使用MoreLinq的DictinctBy http://code.google.com/p/morelinq/

答案 2 :(得分:0)

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

        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() on a particular property