Я пытаюсь реализовать IEqualityComparer
, который имеет допуски при сравнении дат. Я также посмотрел this question. Проблема в том, что я не могу использовать обходной путь, потому что я использую IEqualityComparer
в LINQ .GroupJoin()
. Я пробовал несколько реализаций, которые допускают терпимость. Я могу заставить Equals()
работать, потому что у меня есть оба объекта, но я не могу понять, как реализовать GetHashCode()
.Использование IEqualityComparer GetHashCode с допуском
Моя лучшая попытка выглядит примерно так:
public class ThingWithDateComparer : IEqualityComparer<IThingWithDate>
{
private readonly int _daysToAdd;
public ThingWithDateComparer(int daysToAdd)
{
_daysToAdd = daysToAdd;
}
public int GetHashCode(IThingWithDate obj)
{
unchecked
{
var hash = 17;
hash = hash * 23 + obj.BirthDate.AddDays(_daysToAdd).GetHashCode();
return hash;
}
}
public bool Equals(IThingWithDate x, IThingWithDate y)
{
throw new NotImplementedException();
}
}
public interface IThingWithDate
{
DateTime BirthDate { get; set; }
}
С .GroupJoin()
строит HashTable
из GetHashCode()
это относится дни добавить к обоим/все объекты. Это не работает.
Является ли daysToAdd допуск, так как в январе 5 равен 6 января в пределах допуска на 1 день? Это определение равенства не является транзитивным, поэтому я сомневаюсь, что можно правильно реализовать IEqualityComparer за пределами тривиального решения о возврате одного и того же хэш-кода для каждого объекта. –
Забудьте об этом. Замените 'GroupJoin' на' SelectMany' и просто 'Where' (не очень эффективный, но он должен работать). –
@mikez Да, это допуск. Именование просто плохо. Если я не смогу выполнить эту работу, я просто создам пользовательскую версию 'GroupJoin()'. –