一尘不染

如何使用IEqualityComparer

c#

我的数据库中有一些铃铛号相同。我希望所有这些都没有重复。我创建了一个compare类来完成这项工作,但是该函数的执行会导致该函数的延迟很大,没有区别,从0.6秒到3.2秒!

我做对了还是必须使用其他方法?

reg.AddRange(
    (from a in this.dataContext.reglements
     join b in this.dataContext.Clients on a.Id_client equals b.Id
     where a.date_v <= datefin && a.date_v >= datedeb
     where a.Id_client == b.Id
     orderby a.date_v descending 
     select new Class_reglement
     {
         nom  = b.Nom,
         code = b.code,
         Numf = a.Numf,
     })
    .AsEnumerable()
    .Distinct(new Compare())
    .ToList());

class Compare : IEqualityComparer<Class_reglement>
{
    public bool Equals(Class_reglement x, Class_reglement y)
    {
        if (x.Numf == y.Numf)
        {
            return true;
        }
        else { return false; }
    }
    public int GetHashCode(Class_reglement codeh)
    {
        return 0;
    }
}

阅读 285

收藏
2020-05-19

共1个答案

一尘不染

您的GetHashCode实现始终返回相同的值。Distinct依靠良好的哈希函数可以有效地工作,因为它在内部构建哈希表

在实现类的接口时,重要的一点是 阅读 文档,以了解您应该实现哪个合同。1个

在你的代码,解决办法是转发GetHashCodeClass_reglement.Numf.GetHashCode并实施适当的存在。

除此之外,您的Equals方法中充满了不必要的代码。可以将其重写如下(相同的语义,代码的1/4,更易读):

public bool Equals(Class_reglement x, Class_reglement y)
{
    return x.Numf == y.Numf;
}

最后,该ToList呼叫是不必要且费时的:AddRange接受任何IEnumerable请求,因此List不需要转换为。AsEnumerable
也是 多余的,因为处理结果AddRange仍然会导致这种情况。


1在不知道代码实际作用的情况下编写代码称为“
货物崇拜”编程。这是一种出奇的普遍做法。从根本上讲它不起作用。

2020-05-19