我想覆盖我的一个LINQ to SQL类的EqualityComparer(由visual studio自动生成),这样当我寻找与IndexOf的匹配时,它将使用我的比较而不是它对此类所做的任何事情。它似乎不起作用,我的覆盖不会被调用。
以下是比较的逻辑:
ClientFileList f = new ClientFileList();
f.ClientID = -1 * lines;
f.JobID = JobID;
f.DRSCode = aParts[0];
f.DocumentNumber = aParts[1];
f.Revision = aParts[2];
f.Title = aParts[3];
f.TitleLine2 = aParts[4];
f.TitleLine3 = aParts[5];
f.SheetNumber = aParts[6];
f.Status = aParts[7];
f.ColorCode = ColorCode;
if(oCFile.IndexOf(f)==-1)
{
// this element is not a duplicate
oCFile.Add(f);
}
这是我的扩展类来覆盖EqualityComparer:
public partial class ClientFileList : EqualityComparer<ClientFileList>
{
public override bool Equals(ClientFileList x, ClientFileList y)
{
//throw new NotImplementedException();
return (x.DocumentNumber == y.DocumentNumber &&
x.Revision == y.Revision);
}
public override int GetHashCode(ClientFileList obj)
{
String s = obj.DocumentNumber + obj.Revision;
return s.GetHashCode();
//throw new NotImplementedException();
}
}
我希望的是,如果文档中已经有一个匹配的DocumentNumber和Revision的文档,我不想再添加它(这是在读取分隔的文本文件并插入数据库时实现的)。关于IndexOf的MSDN文档似乎表明它将使用EqualityComparer。 。 。但我没有看到这种行为。我做错了什么?
答案 0 :(得分:2)
我想覆盖我的一个LINQ to SQL类
的EqualityComparer
我真的不认为你这样做。我想您要覆盖Equals
方法,并可能实现IEquatable<T>
。 EqualityComparer
适用于能够比较其他类型对象的对象 - 例如AgeComparer
可能派生自EqualityComparer<Person>
。
如果您覆盖Equals(object)
和GetHashCode
,并实施IEquatable<T>
,那么假设IndexOf
是{{}},我希望oCFile
能够正常工作{1}}或类似的东西(你没有告诉过我们)。但是,它当然不会影响LINQ to SQL本身如何发出查询。