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

标签 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 和 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/

相关文章:

c# - Azure 部署运行时异常

c# - 如果 Sum() 值返回 Null 使用 0,当前是否将其强制转换为可为 null 的 double 值?

C# Is Type in list 问题

c# - 使用泛型的接口(interface) "Cannot implicitly convert type"

Java:泛型、指向 <? 的父类(super class)类型引用扩展父类(super class)>类型引用

C# 获取 Microsoft ReportViewer 加载 XDocument 内容

c# - 是否可以查询 ErrorProvider 是否设置了错误?

c# - 进程锁定文件夹

C# Linq : Return a multidimensional array from a list of Object

sql - OData 是否旨在用于政府和金融环境?我需要什么安全预防措施?