Domanda

Per non ripetere questa domanda troppo, ma ho già fatto una ricerca e si avvicinò vuoto su un risultato. Così ho due EntityCollections di tipo T e mi piacerebbe trovare gli elementi comuni in ogni. La presa? Tutti i campi tranne uno devono corrispondere. Così, per esempio, se il tipo T è un tipo CustomSet e CustomSet include i campi F1, F2, F3 e FK campo OtherId, F1, F2 e F3 devono corrispondere (potrebbero essere stringhe, interi, nulla di veramente) e l'OtherId sarà mai incontro. Il mio attuale implementazione:

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

cederà mai alcun risultato perché tale colonna OtherId sarà mai soddisfatta in ogni altro insieme, anche se i campi F1, F2 e F3 possono corrispondere. Così sto proponendo un'implementazione personalizzata di IEqualityComparer che assomiglia a questo:

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

Ora, sto solo testando questo modo l'obj ottenere passato è di tipo CustomSet, vorrei aggiungere la necessaria se le dichiarazioni per i miei altri tipi se posso ottenere questo per funzionare correttamente. So che l'estensione Intersect utilizza il GetHashCode al posto degli Eguali per confrontare articoli, che è il motivo per cui davvero non mi interessa ciò che è nelle mie eguali come questa classe non sarà mai chiamato, ma per l'estensione Intersect su EntityCollections. La cosa è, questo non funziona. Sul mio insieme di test, so di avere 28 articoli nella mia collezione 'fonte', e 28 articoli nella mia collezione 'destinazione', e tutti i campi di confronto (ovviamente eccezione per il campo OtherId). Ho fatto un passo attraverso il codice GetHashCode come loop 56 volte ed è stato in grado di abbinare codici hash su tutti i 28 elementi di ogni set ancora le 'intersezioni' ha prodotto 0 conteggio. C'è qualcosa che sto facendo male, o manca? Grazie. }

È stato utile?

Soluzione

Questo è il problema:

So che l'estensione Intersect utilizza il GetHashCode al posto del Equals per confrontare articoli, che è il motivo per cui davvero non mi interessa ciò che è nelle mie eguali come questa classe non sarà mai chiamato, ma per l'estensione Intersect su EntityCollections.

Questo non è semplicemente falso. GetHashCode è usato come un primo modo "veloce" di bucket valori, ma Equals sarà ancora chiamato per tutti gli articoli con lo stesso hash, altrimenti non si può sapere sono uguali.

Questo è il modo tabelle hash, ecc sempre lavoro:. Gli hash dovrebbero essere diverse per i valori diseguali, ove possibile per motivi di prestazioni, ma sono ammessi a collidere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top