使用Linq to XML和Distinct()的IEqualityComparer不在代码中执行?

时间:2011-10-17 18:59:52

标签: c# xml linq distinct iequalitycomparer

我在Equals方法中写的并不重要。 GetHashCode总是被触发,但我不知道要返回哪个GetHashCode?

当调用GetHashCode方法时,变量x具有以下数据:

在第一个unitName中,elementName是值"这是我要比较的值" ...

<unit>
  <unitName>This is the value I want to compare</unitName>
  <units>
    <unit>
      <unitName>xxx</unitName>      
      <units>
        <unit>
          <unitName>cccc</unitName>
          <test>33</test>
          <test>44</test>                   
        </unit>
      </units>          
        </unit>
    </units>        
</unit>
IEnumerable<XElement> tempMemberList = doc.Elements("dep").Descendants("customers").Distinct(new XElementComparer());

public class XElementComparer : IEqualityComparer<XElement> {
    public bool Equals(XElement x, XElement y) {

        return x.Value == y.Value;
    }

    public int GetHashCode(XElement x) {
        return x.GetHashCode();
    }
}

3 个答案:

答案 0 :(得分:3)

返回元素的Value的哈希码是有意义的,因为您正在使用它来确定相等性。您的GetHashCode()实施必须与Equals()实施一致。

public class XElementComparer : IEqualityComparer<XElement> {
    public bool Equals(XElement x, XElement y) {
        return x.Value == y.Value;
    }

    public int GetHashCode(XElement x) {
        return x.Value.GetHashCode();
    }
}

答案 1 :(得分:1)

这是解决方案,我只需要从我想要的第一个unitName中获取正确的值...

public class XElementComparer : IEqualityComparer<XElement>
        {
            public bool Equals(XElement x, XElement y)
            {
                string unitNameX = x.Element("unitName ").Value;
                string unitNameY = y.Element("unitName ").Value;
                return unitNameX == unitName Y;
            }

            public int GetHashCode(XElement x)
            {
                string val = x.Element("unitName ").Value;
                return val.GetHashCode();
            }
        }

答案 2 :(得分:0)

您还可以编写适用于大多数xml的内容。

public class XElementComparer : IEqualityComparer<XElement>
{
    public bool Equals(XElement x, XElement y) 
    {
        return (x.FirstAttribute.Value.Equals(y.FirstAttribute.Value) 
                && x.LastAttribute.Value.Equals(y.LastAttribute.Value)); 
    } 

    public int GetHashCode(XElement x) 
    { 
        return x.Value.GetHashCode(); 
    }
}