C# Distinctes sur IEnumerable<T> avec le custom IEqualityComparer

Voici ce que je suis en train de faire. Je suis interrogation d'un fichier XML à l'aide de LINQ to XML, ce qui me donne un IEnumerable<T> objet, où T est mon "Village" de la classe, rempli avec les résultats de cette requête. Certains résultats sont dupliqués, donc je voudrais effectuer un Distinct() sur l'objet IEnumerable, comme suit:

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

Comme le comparateur par défaut ne serait pas travailler pour le Village d'objet, j'ai mis en place un programme personnalisé, comme on le voit ici dans le AllianceComparer classe:

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
}

La méthode Distinct() ne fonctionne pas, car j'ai exactement le même nombre de résultats avec ou sans elle. Une autre chose, et je ne sais pas si c'est possible, mais je ne peut pas en AllianceComparer.Equals() pour voir ce qui pourrait être le problème.

J'ai trouvé des exemples sur Internet, mais je n'arrive pas à faire mon travail de mise en œuvre.

Espérons-le, quelqu'un ici pourrait voir ce qui pourrait être mal ici!
Merci à l'avance!

  • Votre attraper/lancer construire fait où la fonction appelante ne peut plus choisir de catch(exception d'argument) ou catch(IOException) (exemples). Dans ce cas, vous êtes probablement mieux de retirer le try/catch tous ensemble - en outre, le nom de la méthode sera la partie de l'exception StackTrace de la propriété.
InformationsquelleAutor Fueled | 2009-01-11