【问题标题】:IEqualityComparer with Linq to XML and Distinct() is not executed in code?带有 Linq to XML 和 Distinct() 的 IEqualityComparer 不在代码中执行?
【发布时间】:2011-10-17 18:59:52
【问题描述】:

我在 Equals 方法中写什么并不重要。 GetHashCode 总是被触发,但我不知道返回谁的 GetHashCode?​​p>

当调用 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();
    }
}

【问题讨论】:

    标签: c# xml linq distinct iequalitycomparer


    【解决方案1】:

    返回元素的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();
        }
    }
    

    【讨论】:

    • p.s.,您的查询实际上并没有产生任何元素。您发布的 XML 中没有任何 dep 元素,也没有 customers 元素。
    • 当然没问题,但是如果您要更改名称,则应保持一致并更改其所有用途,以免破坏任何内容。 ;)
    • 你知道我的 xml 结构你应该使用 "unitName" :)
    【解决方案2】:

    这就是解决方案,我只需要从我想要的第一个 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();
                }
            }
    

    【讨论】:

      【解决方案3】:

      您还可以编写适用于大多数 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(); 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多