具有数组属性的类的C#Equality

时间:2016-09-26 07:15:37

标签: c#

我有以下价值

public class Identification : IEquatable<Identification> 
{
    public int Id { get; set; }
    public byte[] FileContent { get; set; }
    public int ProjectId { get; set; }
}

我使用resharper生成了平等成员

    public bool Equals(Identification other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return Id == other.Id && Equals(FileContent, other.FileContent) && ProjectId == other.ProjectId;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((Identification) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = Id;
            hashCode = (hashCode*397) ^ (FileContent != null ? FileContent.GetHashCode() : 0);
            hashCode = (hashCode*397) ^ ProjectId;
            return hashCode;
        }
    }

    public static bool operator ==(Identification left, Identification right)
    {
        return Equals(left, right);
    }

    public static bool operator !=(Identification left, Identification right)
    {
        return !Equals(left, right);
    }

但是当我想要从存储库返回之前和之后进行单元测试时,它会失败。尽管在失败消息中具有完全相同的属性。

var identification = fixture
                .Build<Identification>()
                .With(x => x.ProjectId, projet.Id)
                .Create();
await repository.CreateIdentification(identification);
var returned = await repository.GetIdentification(identification.Id);
  

Assert.Equal()失败

     

预期:标识{FileContent = [56,192,243],Id = 8,ProjectId = 42}

     

实际:标识{FileContent = [56,192,243],Id = 8,ProjectId = 42}

如果重要的话,我正在使用Npgsql和Dapper。

1 个答案:

答案 0 :(得分:1)

对于检查:

的数组,您应该使用Enumerable.SequenceEqual
  • 两个数组都是null,或者两个数组都不是null
  • 两个数组都有相同的Length
  • 相应的物品彼此相等。

像这样的东西

public bool Equals(Identification other)
{
    if (ReferenceEquals(null, other)) 
      return false;
    else if (ReferenceEquals(this, other)) 
      return true;

    return Id == other.Id && 
           ProjectId == other.ProjectId &&
           Enumerable.SequenceEqual(FileContent, other.FileContent);
}

由于Enumerable.SequenceEqual很可能耗费时间,我已将其转移到比较的末尾(如果ProjectId未能相等,则无需检查数组)