c# - 对列表中的重复数据进行分组和删除c#
问题描述
我想知道如何实现分组和消除重复数据,例如我有这个类:
public class MyObject
{
public string attrb1{ get; set; }
public string attrb2{ get; set; }
}
我想“调试”重复的对象,尝试以下,但它不起作用。
List<MyObject> ListObject = new List<MyObject>();
var obj1 = new MyObject{attrb1="attrb1", attrb2="attrb2"}
ListObject.Add(obj1);
var obj2 = new MyObject{attrb1="attrb1", attrb2="attrb2"}
ListObject.Add(obj2);
List<MyObject> GroupedList= new List<MyObject>();
foreach(var obj in ListObject)
{
if(!GroupedList.Contains(obj))
GroupedList.Add(obj);
}
解决方案
默认情况下,类之间的相等性是通过比较它们的引用(内存位置)来确定的,因此两个类只有在它们都指向同一个实例时才相等。
如果要定义确定相等性的不同方式,则需要覆盖Equals
方法 (and GetHashCode
)。
如果两个实例的属性相等并且它们的属性相等,您似乎希望将两个MyObject
实例视为相等。如果是这种情况,您可以像这样覆盖:attrib1
attrib2
Equals
public class MyObject
{
public string attrb1 { get; set; }
public string attrb2 { get; set; }
public override bool Equals(object obj)
{
var other = obj as MyObject;
return other != null && other.attrb1 == attrb1 && other.attrb2 == attrb2;
}
public override int GetHashCode()
{
return (attrb1 + attrb2).GetHashCode();
}
}
进行此更改后,GroupedList
您的示例代码中的 将仅包含一项。
推荐阅读
- php - 更改 pchart 分隔符
- python - 阅读outlook邮箱,连续收到两封相同主题的邮件
- scala - 当您使用 Seq(1,2,3) 创建 Seq 对象时会发生什么?
- php - 如何使用 php 压缩/降低 base64 图像的质量?
- java - 尝试使用 replaceFirst 将值添加到查询字符串参数字段
- python - 搜索 pandas.Series 中不存在的标签时出现 KeyError
- mysql - 单个 mysql 查询:使表的 NULL 值和数据库中的列
- r - For 循环不适用于 If 语句:条件的长度 > 1 并且只会使用第一个元素
- angular - 使用Angular显示外键值而不是键
- java - 获取“不支持:http://javax.xml.XMLConstants/property/accessExternalDTD 异常”,同时在 gradle 中添加 apche cxf-bundle 作为依赖项