Esto es lo que estoy tratando de hacer. Estoy consultando un archivo XML usando LINQ to XML, que me da un objeto IEnumerable <T
>, donde T es mi clase "Village", llena con los resultados de esta consulta. Algunos resultados se duplican, por lo que me gustaría realizar una Distinto() en el objeto IEnumerable, así:C# Distinto en IEnumerable <T> con IEqualityComparer personalizado
public IEnumerable<Village> GetAllAlliances()
{
try
{
IEnumerable<Village> alliances =
from alliance in xmlDoc.Elements("Village")
where alliance.Element("AllianceName").Value != String.Empty
orderby alliance.Element("AllianceName").Value
select new Village
{
AllianceName = alliance.Element("AllianceName").Value
};
// TODO: make it work...
return alliances.Distinct(new AllianceComparer());
}
catch (Exception ex)
{
throw new Exception("GetAllAlliances", ex);
}
}
Como el comparador predeterminado no funcionaría para el objeto Village, he implementado una personalizada, como se ha visto aquí en la clase AllianceComparer:
public class AllianceComparer : IEqualityComparer<Village>
{
#region IEqualityComparer<Village> Members
bool IEqualityComparer<Village>.Equals(Village x, Village y)
{
// Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y))
return true;
// Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.AllianceName == y.AllianceName;
}
int IEqualityComparer<Village>.GetHashCode(Village obj)
{
return obj.GetHashCode();
}
#endregion
}
el método distinct() no funciona, ya que tengo exactamente el mismo número de resultados con o sin él. Otra cosa, y no sé si generalmente es posible, pero no puedo entrar en AllianceComparer.Equals() para ver cuál podría ser el problema.
He encontrado ejemplos de esto en Internet, pero parece que no puedo hacer que mi implementación funcione.
¡Con suerte, alguien aquí podría ver lo que podría estar mal aquí! ¡Gracias de antemano!
Tu construcción catch/throw hace que la función de llamada ya no pueda elegir capturar (ArgumentException) o catch (IOException) (ejemplos). En este caso, probablemente sea mejor que elimines el try/catch todos juntos; además, el nombre del método será parte de la propiedad de StackTrace de excepción. –