我的数据库中有一些铃铛号相同。我希望所有这些都没有重复。我创建了一个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; } }
您的GetHashCode实现始终返回相同的值。Distinct依靠良好的哈希函数可以有效地工作,因为它在内部构建哈希表。
GetHashCode
Distinct
在实现类的接口时,重要的一点是 阅读 文档,以了解您应该实现哪个合同。1个
在你的代码,解决办法是转发GetHashCode到Class_reglement.Numf.GetHashCode并实施适当的存在。
Class_reglement.Numf.GetHashCode
除此之外,您的Equals方法中充满了不必要的代码。可以将其重写如下(相同的语义,代码的1/4,更易读):
Equals
public bool Equals(Class_reglement x, Class_reglement y) { return x.Numf == y.Numf; }
最后,该ToList呼叫是不必要且费时的:AddRange接受任何IEnumerable请求,因此List不需要转换为。AsEnumerable这 也是 多余的,因为处理结果AddRange仍然会导致这种情况。
ToList
AddRange
IEnumerable
List
AsEnumerable
1在不知道代码实际作用的情况下编写代码称为“ 货物崇拜”编程。这是一种出奇的普遍做法。从根本上讲它不起作用。