2016-05-04 6 views
1

私はList.Contains(anotherCustomObject)を使用できるようにIEquatableを実装するカスタムオブジェクトを持っています。したがって、オブジェクトが含まれている場合は、それをリストから削除します。IEquatableを使用したオブジェクトの比較が失敗する

の問題は、私の実装.Equalsが期待通りに動作し、いくつかが、今、すべてが同じように起動していない表示され、リストから削除されていないされていないということです。 currentSpecs下の画像では、明確にする

は、私はそれがtmpAS400Specsからすべてが含まれている場合から削除するリストです。以下は

enter image description here

コードです。

public class AS400SpecificationAttribute : IEquatable<AS400SpecificationAttribute> 
{ 
    private string name; 
    private string value; 
    private string group; 
    private string productNumber; 


    public string ProductNumber 
    { 
     get { return productNumber; } 
     set 
     { 
      if (!String.IsNullOrEmpty(value) && !String.IsNullOrWhiteSpace(value)) 
       productNumber = value.Trim().ToUpper(); 
     } 
    } 

    public string AttributeName 
    { 
     get 
     { 
      return this.name; 
     } 
     set 
     { 
      if (!String.IsNullOrEmpty(value) && !String.IsNullOrWhiteSpace(value)) 
       this.name = value.Trim(); 
     } 
    } 
    public string AttributeValue 
    { 
     get 
     { 
      return this.value; 
     } 
     set 
     { 
      if (!String.IsNullOrEmpty(value) && !String.IsNullOrWhiteSpace(value)) 
       this.value = value.Trim().Replace("\\\"","\""); 
     } 
    } 
    public string AttributeGroup 
    { 
     get 
     { 
      return this.group; 
     } 
     set 
     { 
      if (!String.IsNullOrEmpty(value) && !String.IsNullOrWhiteSpace(value)) 
       this.group = value.Trim(); 
     } 
    } 

    public bool Equals(AS400SpecificationAttribute other) 
    { 
     if (other == null) 
      return false; 
     return this.ProductNumber.Equals(other.productNumber) 
      && ((this.group != null && this.group.Equals(other.AttributeGroup)) 
      || (this.group == null && other.AttributeGroup == null)) 
      && ((this.name!= null && this.name.Equals(other.AttributeName)) 
      || (this.name == null && other.AttributeName == null)) 
      && ((this.value != null && this.value.Equals(other.AttributeValue)) 
      || (this.value == null && other.AttributeName == null)); 
    } 
} 

を比較するため

var tmpSpecs = new AS400SpecificationAttribute 
{ 
    ProductNumber = workTask.WIITEM, 
    AttributeGroup = attrGroup, 
    AttributeName = attrName, 
    AttributeValue = attrValue 
}; 

if (currentSpecs.Contains(tmpSpecs)) 
{ 
    currentSpecs.Remove(tmpSpecs); 
} 

コードはなぜ比較は二つの属性が同じであることを検出することができないのですか?

Object A.value = 'x', Object B.value = 'X'.

が大文字小文字を区別しません作ってみましょう、またはあなたのオブジェクトが本当に同じであることを確認してください。

+0

あなたは、内側の括弧は多少このようなものですそこにいくつかの括弧が欠落しているようです? '((this.group!= nullの&& this.group.Equals(other.AttributeGroup))|| this.group == nullの&& other.AttributeGroup == null)の' –

+0

あなたは少なくともプロパティの実装で私たちに完全なクラスを表示することができますか? –

+0

@ LasseV.Karlsen真ではあるが、主な問題ではなく、まだエラーが発生している。 –

答えて

1

など

0
public override bool Equals(object obj) 
{ 
    var other = obj as AS400SpecificationAttribute; 
    if (other == null) 

...私はこれに気づきました。 (|| C && D)(&& b)は `すべきではない` `C && D '括弧内のことだけでなく:

+0

'List 'は 'EqualityComparer .Default'を使用しているため、実装されているときに' IEquatable 'を使用します。 –

+0

私は、その答えを詳述することはいいと思う。 – Kamo

関連する問題