Pregunta

No para repetir esta pregunta demasiado, pero ya hice una búsqueda y salí vacío en un resultado. Así que tengo dos entidades del tipo T y me gustaría encontrar los elementos comunes en cada uno. ¿La captura? Todos los campos, excepto uno, uno debe coincidir. Entonces, por ejemplo, si el tipo T es un tipo de aduana, y la aduana incluye los campos F1, F2, F3 y un campo FK OtroID, F1, F2 y F3 deben coincidir (podrían ser cadenas, ints, cualquier cosa realmente) y el otro nunca juego. Mi implementación actual:

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

Nunca producirá ningún resultado porque esa columna OtroID nunca coincidirá en ninguna otra colección, a pesar de que los campos F1, F2 y F3 pueden coincidir. Así que propongo una implementación personalizada de IequalityComparer que se ve así:

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

Ahora, solo estoy probando esto, por lo que el OBJ que se pasa es de tipo Custetset, agregaré las declaraciones necesarias para mis otros tipos si puedo hacer que esto funcione correctamente. Sé que la extensión de intersección usa el Código Gethash en lugar de los iguales para comparar elementos, por lo que realmente no me importa lo que hay en mis iguales, ya que nunca se llamará a esta clase, sino para la extensión de intersección en EntityCollections. La cosa es que esto no funciona. En mi conjunto de pruebas, sé que tengo 28 elementos en mi colección 'fuente' y 28 elementos en mi colección 'Destino', y todos los campos coinciden (obviamente excepto el campo OtroID). Atravesé el código GethashCode, ya que recorrió 56 veces y pude hacer coincidir los códigos hash en los 28 elementos de cada conjunto, pero las 'intersecciones' produjeron 0 recuento. ¿Hay algo que estoy haciendo mal o perdiendo? Gracias. }

¿Fue útil?

Solución

Este es tu problema:

Sé que la extensión de intersección usa el Código Gethash en lugar de los iguales para comparar elementos, por lo que realmente no me importa lo que hay en mis iguales, ya que nunca se llamará a esta clase, sino para la extensión de intersección en EntityCollections.

Eso simplemente no es cierto. GetHashCode se usa como una primera forma "rápida" de valores de bulleteo, pero Equals Todavía será llamado para cualquier elemento con el mismo hash, de lo contrario no se sabe que son iguales.

Así es como funcionan las tablas hash, etc. permitió chocar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top