IEqualityComparer с Linq to XML и Distinct () не выполняется в коде? - PullRequest
3 голосов
/ 17 октября 2011

Неважно, что я пишу в методе 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 ]

3 голосов
/ 17 октября 2011

Имеет смысл возвращать хеш-код 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 голос
/ 17 октября 2011

Это решение, мне просто нужно было получить правильное значение от первого имени модуля, которое я хотел ...

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();
            }
        }
0 голосов
/ 16 октября 2012

Вы также можете написать что-то, что будет работать для большинства 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(); 
    }
}
...