37

我无法从集合中删除重复项,我已经为 Employee 类实现了 IEqualityComparer 仍然没有得到输出

static void Main(string[] args)
    {
        List<Employe> Employeecollection = new List<Employe>();

        Employeecollection.Add(new Employe("abc","def"));
        Employeecollection.Add(new Employe("lmn","def"));
        Employeecollection.Add(new Employe("abc", "def"));

        IEnumerable<Employe> coll = Employeecollection.Distinct(new Employe());

        foreach (Employe item in coll)
        {
            Console.WriteLine(item.fName + "   " + item.lName );
        }

    }

下面是Employee类的实现,这里我实现了IEqualityComparer

class Employe : IEqualityComparer<Employe>
{
    public string fName { get; set; }
    public string lName { get; set; }

    public Employe()
    {

    }

    public Employe(string firstName, string LastName)
    {
        this.fName = firstName;
        this.lName = LastName;
    }

    #region IEqualityComparer<pcf> Members

    public bool Equals(Employe x, Employe y)
    {
        if (x.fName == y.fName && x.lName == y.lName)
        {
            return true;
        }

        return false;
    }

    public int GetHashCode(Employe obj)
    {
        return obj.GetHashCode();
    }

    #endregion
}
4

6 回答 6

104

忘记 IEqualityComparer,直接使用 Linq:

EmployeeCollection.GroupBy(x => new{x.fName, x.lName}).Select(g => g.First());
于 2013-06-07T12:03:19.173 回答
5

您需要覆盖GetHashCodeEmployee 中的方法。你没有这样做。下面给出了一个好的散列方法示例:(由ReSharper生成)

public override int GetHashCode()
{
    return ((this.fName != null ? this.fName.GetHashCode() : 0) * 397) ^ (this.lName != null ? this.lName.GetHashCode() : 0);
}

现在Distinct调用之后,foreach 循环打印:

abc   def
lmn   def

在您的情况下,您正在调用对象的 class GetHashCode,它对内部字段一无所知。

一个简单的说明,MoreLINQ包含DistinctBy扩展方法,它允许您执行以下操作:

IEnumerable<Employe> coll = 
 Employeecollection.DistinctBy(employee => new {employee.fName, employee.lName});

GetHashCode匿名对象对和Equals方法都有正确的实现。

于 2013-06-07T12:02:55.657 回答
5

这是一个很好的教程

    public int GetHashCode(Employe obj)
    {
        return obj.fname.GetHashCode() ^ obj.lname.GetHashCode();
    }
于 2013-06-07T12:03:19.230 回答
3

哈希码实现不正确:

public override int GetHashCode()
{
    return 13 * fName.GetHashCode() + 7 * lName.GetHashCode();
}
于 2013-06-07T12:03:41.473 回答
0

此外,它看起来像您通过引用而不是内容进行比较,因此比较功能不起作用。

将其更改为使用 .Equals() 而不是 == 它应该可以工作。下面的例子:

#region IEqualityComparer<pcf> Members

public bool Equals(Employe x, Employe y)
{
    if (x.fName.Equals(y.fName) && x.lName.Equals(y.lName))
    {
        return true;
    }

    return false;
}

public int GetHashCode(Employe obj)
{
    return obj.GetHashCode();
}

#endregion
于 2015-12-16T23:28:08.083 回答
-1
public int GetHashCode(Employe obj)
{
    return obj.GetHashCode();
}

对于此方法,返回要比较是否相等的属性的哈希码,而不是对象本身。比较对象的哈希码将始终为false,因此您的列表将永远不会被过滤重复。

于 2015-06-10T21:52:35.760 回答