C# - 字典 - 文件路径(自定义EqualityComparer)(C# - Dictionar

2019-10-20 04:20发布

问题:自定义对象实现EqualityComparer和IEquatable,但解释并不总是使用这些方法。

背景:我创建了一个辅助类, FilePath与文件路径处理,而不是将它们视为字符串。 助手类是负责确定如果两个文件路径是相等的。 然后我需要存储在一个文件路径Dictionary<FilePath, object>

目标:

  Assert.True(new FilePath(@"c:\temp\file.txt").Equals(
      new FilePath(@"C:\TeMp\FIle.tXt")); 

  var dict = new Dictionary<FilePath, object>
  {
      {new FilePath(@"c:\temp\file.txt"), new object()}
  }

  Assert.True(dict.ContainsKey(new FilePath(@"c:\temp\file.txt"));

  Assert.True(dict.ContainsKey(new FilePath(@"C:\TeMp\FIle.tXt"));

我已经建立了我的文件路径类:公共类文件路径:EqualityComparer,IEquatable {私人字符串_fullPath;

    public FilePath (string fullPath)
    {
        _fullPath = Path.GetFullPath(fullPath);
    }

    public override bool Equals(FilePath x, FilePath y)
    {
        if (null == x || null == y)
            return false;

        return (x._fullPath.Equals(y._fullPath, StringComparison.InvariantCultureIgnoreCase));
    }

    public override int GetHashCode(FilePath obj)
    {
        return obj._fullPath.GetHashCode();
    }

    public bool Equals(FilePath other)
    {
        return Equals(this, other);
    }

    public override bool Equals(object obj)
    {
        return Equals(this, obj as FilePathSimple);
    }
}

题:

断言1和2通,但断言3失败:

 Assert.True(dict.ContainsKey(new FilePath(@"C:\TeMp\FIle.tXt"));

Answer 1:

我需要重写GetHashCode(),以及:

 public override int GetHashCode()
 {
     return _fullPath.ToLower().GetHashCode();
 }

参考文献: 什么是的GetHashCode中的IEqualityComparer <T>在.NET中的作用?

编译器警告(3级)CS0659



文章来源: C# - Dictionary - File Path (Custom EqualityComparer)