【问题标题】:Override EqualityComparer for LINQ to SQL class覆盖 LINQ to SQL 类的 EqualityComparer
【发布时间】:2015-04-22 17:25:54
【问题描述】:

我想为我的一个 LINQ to SQL 类(由 Visual Studio 自动生成)覆盖 EqualityComparer,这样当我查找与 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 。 . .但我没有看到这种行为。我做错了什么?

【问题讨论】:

  • 您不应该将答案编辑到问题中。

标签: c# .net observablecollection


【解决方案1】:

我想为我的 LINQ to SQL 类之一覆盖 EqualityComparer

我真的不认为你这样做。我认为您想覆盖Equals 方法,并可能实现IEquatable&lt;T&gt;EqualityComparer 用于能够比较 other 类型对象的对象 - 例如,AgeComparer 可能派生自 EqualityComparer&lt;Person&gt;

如果您覆盖Equals(object)GetHashCode,并且还实现IEquatable&lt;T&gt;,那么我希望IndexOf 可以工作,假设oCFileList&lt;ClientFileList&gt; 或类似的东西(您还没有告诉我们)。但是,它当然不会影响 LINQ to SQL 本身发出查询的方式。

【讨论】:

  • 谢谢。 . .那效果很好。除了使用 IEquitable 之外,Equals 和 GetHashCode 方法不是覆盖,而是简单地实现。我将工作代码放在我的问题中以供参考。
  • @PaulGibson:不,你仍然从System.Object 覆盖Equals(object)GetHashCode。或者至少,您应该覆盖Equals(object) - 但您没有这样做。您应该会看到有关 GetHashCode...的警告。
  • @PaulGibson:但你应该仍然覆盖Object.GetHashCodeObject.Equals - 这就是我要说的。如果您根据确切调用方法的方式得到不同的结果,那会很奇怪。
  • @PaulGibson:此外,我注意到您并没有真正完全实现GetHashCode 部分 - 您不应该有参数(它旨在获取哈希this 的代码)。所以它之所以有效,是因为List&lt;T&gt;.IndexOf 不使用哈希码——例如,如果你开始将它用作字典键,你就会遇到问题。
  • @PaulGibson:如果你真的想要这样,我建议在一个单独的类中实现IEqualityComparer&lt;T&gt;,然后调用list.Contains(item, comparer) 来检查列表是否包含该项目以特定的方式。或者只使用list.Any(x =&gt; x.RevisionNumber == y.RevisionNumber &amp;&amp; x.DocumentNumber == y.DocumentNumber)。我会强烈建议不要让一个对象以不明显的方式暴露不同的平等概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多