Пересечь с двумя EntityCollections через пользовательский iEqualityComparer
-
24-10-2019 - |
Вопрос
Не повторять этот вопрос слишком много, но я уже сделал поиск и пришел пустым в результате. Таким образом, у меня есть два объединения объектов типа 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
все еще будет вызван для любых предметов с тем же хэшем, иначе вы не можете знать, что они равны.
Именно так хэш -таблицы и т. Д. Всегда работают: хэши должны быть разными для неравных значений, где это возможно по соображениям производительности, но допустимый сталкиваться.