从具有重复列值的集合中选择第一条记录 C#

Posted

技术标签:

【中文标题】从具有重复列值的集合中选择第一条记录 C#【英文标题】:Selecting the first record from a collection with Duplicate column values C# 【发布时间】:2022-01-19 08:57:05 【问题描述】:

我有一个记录列表。

public class Record 

 public int Idget;set;
 public string Name get;set;
 public string Descriptionget;set;


List<Record> records = 

  1, "A","Desc1",
  2, "A","Desc2",
  3, "B","Desc3",
  4, "B","Desc4",
  5, "C","Desc5"

我需要检查名称,如果相同,请选择第一条记录。所以,我需要输出为:

 List<Record> records = 
    
      1, "A","Desc1",
      3, "B","Desc3",
      5, "C","Desc5"
    

我尝试分组,但我不需要分组列表中的所有列。

【问题讨论】:

有什么可以使您的问题 [C#-3.0] 和 [C#-4.0] 具体化吗?这些是十多年前的过时版本。 【参考方案1】:

您可以将 Linq 与组名称一起使用并获取第一个组元素:

var cleaned = from r in records
              group r by r.Name into grp
              select grp.First();

【讨论】:

【参考方案2】:

我假设您想要一个完整的列表,而不仅仅是一个项目。

我建议使用不允许任何重复的HashSet。如果它是否重复,您需要通过覆盖类中的EqualsGetHashCode 函数来控制,如下所示:

public class Record

    public int Id  get; set; 
    public string Name  get; set; 
    public string Description  get; set; 
    
    public override bool Equals(object obj)
    
        Record other = obj as Record;

        return !Object.ReferenceEquals(null, other)
            && String.Equals(this.Name, other.Name);
    

    public override int GetHashCode()
    
        int hash = 13;
        hash = (hash * 7) + this.Name.GetHashCode();
        return hash;
    

EqualsGetHashCode 函数必须仅基于 Name 工作(因为在这种情况下,这决定了您的唯一性)。

然后你可以简单地从你的列表中创建一个Hashset

HashSet<Record> uniqueRecords = new HashSet<Record>(records);

如果你真的需要一个列表,那么你可以转换回一个列表。

【讨论】:

为什么要使用int hash = 13; hash = (hash * 7) + 片段?为什么不 return Name?.GetHashCode() ?? 0; 您当前的代码实际上返回 91 + Name.GetHashCode(); Equals 的短版:public override bool Equals(object obj) =&gt; obj is Record other &amp;&amp; string.Equals(Name, other?.Name);【参考方案3】:

一种尝试可能是按描述对记录列表进行排序,然后按不同的名称进行过滤:

var filteredRecords = records.OrderBy(x => x.Description).DistinctBy(x => x.Name);

【讨论】:

也许你错过了警告这个方法只适用于 .NET 6...

以上是关于从具有重复列值的集合中选择第一条记录 C#的主要内容,如果未能解决你的问题,请参考以下文章

Ext JS:如何在具有多个列值的网格中查找记录

SQL:如何从重复行中选择第一条记录?

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

使用 Eloquent 选择具有值的最后一条记录

选择基于重复项的第一条记录[重复]

两个不同组中具有不同列值的记录数