2016-09-26 17 views
1

我具有以下值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,专案编号= 42}

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

我在使用Npgsql和Dapper(如果它很重要)。

+5

数组比较是引用相等,只需将其替换为SequenceEquals() –

回答

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能够很好地时间cosuming我已经转向到比较结束(有没有需要检查阵列如果说,ProjectId如未能按要求等于)