使用IEquatable失败的对象比较

时间:2016-05-04 13:18:00

标签: c#

我有自定义对象实现IEquatable,以便我可以使用List.Contains(anotherCustomObject)。因此,如果它包含该对象,则将其从列表中删除。

问题是我实现的.Equals没有按预期工作,但是现在所有的都显示为不相等而且没有从List中删除。

为了澄清,在下面的图像中,currentSpecs是我要删除的列表,如果它包含来自tmpAS400Specs的任何列表。

enter image description here

以下是代码。

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

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

比较代码

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)); 
    }
}

为什么比较无法检测到两个属性是否相同?

2 个答案:

答案 0 :(得分:1)

我注意到了这一点:

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

尝试使其不区分大小写,或确保您的对象真正相等。

答案 1 :(得分:0)

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

......等等。