首页 > 解决方案 > 对列表中的重复数据进行分组和删除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);
}

标签: c#list

解决方案


默认情况下,类之间的相等性是通过比较它们的引用(内存位置)来确定的,因此两个类只有在它们都指向同一个实例时才相等。

如果要定义确定相等性的不同方式,则需要覆盖Equals方法 (and GetHashCode)。

如果两个实例的属性相等并且它们的属性相等,您似乎希望将两个MyObject实例视为相等。如果是这种情况,您可以像这样覆盖:attrib1attrib2Equals

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您的示例代码中的 将仅包含一项。


推荐阅读