Question

Pour ne pas répéter cette question trop, mais je l'ai déjà fait une recherche et a trouvé vide sur un résultat. J'ai donc deux EntityCollections de type T et je voudrais trouver les éléments communs à chacun. Le hic? Tous les champs sauf un doivent correspondre. Ainsi, par exemple, si le type T est un type CustomSet et CustomSet comprend des champs F1, F2, F3 et un champ FK OtherId, F1, F2 et F3 doivent correspondre (ils peuvent être des chaînes, ints, quoi que ce soit vraiment) et le OtherId ne sera jamais rencontre. Ma mise en œuvre actuelle:

var intersections = source.Intersect(destination).ToList();

ne sera jamais donné aucun résultat car cette colonne OtherId ne correspondra jamais à dans une autre collection, même si les champs F1, F2 et F3 peuvent correspondre. Je propose donc une implémentation personnalisée de IEqualityComparer qui ressemble à ceci:

var intersections = source.Intersect(destination, new EntityCollectionComparer<T>()).ToList();

public class EntityCollectionComparer<T> : IEqualityComparer<T>
{
    #region IEqualityComparer<T> Members

    public bool Equals(T x, T y)
    {
        if (x.Equals(y))
            return true;
        else
            return false;
    }

    public int GetHashCode(T obj)
    {
        if (obj is CustomSet)
        {
            CustomSet temp = obj as CustomSet;

            return (temp.F1.GetHashCode() ^ temp.F2.GetHashCode() ^ temp.F3.GetHashCode());
        }
        return obj.GetHashCode();
    }

Maintenant, je teste seulement cela de sorte que le obj se passé dans est de type CustomSet, je vais ajouter le nécessaire si les déclarations de mes autres types si je peux obtenir que cela fonctionne correctement. Je sais que l'extension Intersection utilise le GetHashCode au lieu des Egaux pour comparer des éléments qui est la raison pour laquelle je ne me soucie pas ce qui est dans mes égaux que cette classe ne sera jamais appelé mais pour l'extension Intersection sur EntityCollections. La chose est, cela ne fonctionne pas. Sur mon jeu de test, je sais que j'ai 28 articles dans ma collection « source » et 28 articles dans ma collection « de destination », et tous les champs correspondent (évidemment à l'exception du champ OtherId). Je suis entré dans le code GetHashCode comme il en boucle 56 fois et a été en mesure de faire correspondre les codes de hachage sur l'ensemble des 28 articles de chaque jeu encore les « intersections » ont donné 0 nombre. Y at-il quelque chose que je fais mal, ou manquant? Merci. }

Était-ce utile?

La solution

Ceci est votre problème:

Je sais que l'extension Intersection utilise le GetHashCode au lieu des Egaux pour comparer des éléments qui est la raison pour laquelle je ne me inquiète pas vraiment ce qui est dans mes égaux que cette classe ne sera jamais appelé mais pour l'extension Intersection sur EntityCollections.

C'est tout simplement pas vrai. GetHashCode est utilisé comme première manière de valeurs bucketing « rapide », mais Equals sera toujours appelé à tous les éléments avec le même hachage, sinon vous ne pouvez pas savoir qu'ils sont égaux.

C'est les tables de hachage façon etc toujours de travail:. Les hash doivent être différentes des valeurs inégales si possible pour des raisons de performance, mais sont autorisés à entrer en collision

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top