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

我有一个记录列表。

public class Record 
{
 public int Id{get;set;}
 public string Name {get;set;}
 public string Description{get;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] 具体化吗?这些是十多年前的过时版本。

标签: c# .net


【解决方案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...
    猜你喜欢
    • 2012-04-23
    • 2018-09-03
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多