从具有重复列值的集合中选择第一条记录 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
。如果它是否重复,您需要通过覆盖类中的Equals
和GetHashCode
函数来控制,如下所示:
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;
Equals
和 GetHashCode
函数必须仅基于 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) => obj is Record other && string.Equals(Name, other?.Name);
【参考方案3】:
一种尝试可能是按描述对记录列表进行排序,然后按不同的名称进行过滤:
var filteredRecords = records.OrderBy(x => x.Description).DistinctBy(x => x.Name);
【讨论】:
也许你错过了警告这个方法只适用于 .NET 6...以上是关于从具有重复列值的集合中选择第一条记录 C#的主要内容,如果未能解决你的问题,请参考以下文章