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é.
Vous devez vous connecter pour publier un commentaire.
Le problème est avec votre
GetHashCode
. Vous devriez les modifier, il renvoie le code de hachage deAllianceName
à la place.La chose est, si
Equals
retournetrue
, les objets doivent avoir le même code de hachage qui n'est pas le cas pour les différentsVillage
objets avec le mêmeAllianceName
. DepuisDistinct
travaux par la construction d'une table de hachage en interne, vous vous retrouverez avec les objets égaux à ne pas être appariés à tous en raison de différents codes de hachage.De même, pour comparer deux fichiers, si le hash de deux fichiers ne sont pas les mêmes, vous n'avez pas besoin de vérifier les fichiers eux-mêmes à tous. Ils va être différentes. Sinon, vous continuerez à vous de vérifier pour voir si elles sont vraiment la même chose ou pas. C'est exactement ce que la table de hachage qui
Distinct
utilise se comporte.Equals
etGetHashCode
et écrire unGetHashCode
à l'égard de laEquals
méthode.Qui retourne un
IEnumerable<string>
au lieu deIEnumerable<Village>
.Ou modifier la ligne
à