Пересечь с двумя EntityCollections через пользовательский iEqualityComparer

StackOverflow https://stackoverflow.com/questions/4784866

Вопрос

Не повторять этот вопрос слишком много, но я уже сделал поиск и пришел пустым в результате. Таким образом, у меня есть два объединения объектов типа T, и я хотел бы найти общие предметы в каждом. Улов? Все поля, кроме одного, должны соответствовать. Так, например, если тип t - это тип Customset, а Customset включает в себя поля F1, F2, F3 и FK Field OtherID, F1, F2 и F3 должны совпадать (это могут быть строки, INT, что -нибудь на самом деле), а другие никогда не будут. соответствие. Моя текущая реализация:

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

никогда не даст никаких результатов, потому что этот другой столбец никогда не будет совпадать в какой -либо другой коллекции, даже если поля F1, F2 и F3 могут совпадать. Так что я предлагаю пользовательскую реализацию iequalityComperer, которая выглядит так:

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

Теперь я только проверяю это, чтобы, чтобы obJ, передаваемое, имеет тип Customset, я добавлю необходимые операторы для других моих типов, если я смогу заставить это правильно функционировать. Я знаю, что расширение пересечения использует Gethashcode вместо равных для сравнения элементов, поэтому мне действительно все равно, что у меня в равных, так как этот класс никогда не будет вызван, а для расширения пересечения на EntityCollections. Дело в том, что это не работает. В моем тестовом наборе я знаю, что у меня есть 28 пунктов в моей коллекции «Источник» и 28 элементов в моей коллекции «назначения», и все поля совпадают (очевидно, за исключением поля другого). Я прошел через код GethashCode, когда он зациклен в 56 раз и смог сопоставить хэш -коды по всем 28 элементам из каждого набора, но «перекрестки» дали 0 подсчета. Что -то я делаю не так, или отсутствует? Спасибо. }

Это было полезно?

Решение

Это ваша проблема:

Я знаю, что расширение пересечения использует Gethashcode вместо равных для сравнения элементов, поэтому мне действительно все равно, что у меня в равных, так как этот класс никогда не будет вызван, а для расширения пересечения на EntityCollections.

Это просто неправда. GetHashCode используется как первый «быстрый» способ ведения значений, но Equals все еще будет вызван для любых предметов с тем же хэшем, иначе вы не можете знать, что они равны.

Именно так хэш -таблицы и т. Д. Всегда работают: хэши должны быть разными для неравных значений, где это возможно по соображениям производительности, но допустимый сталкиваться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top