날짜 비교에 허용 오차가있는 IEqualityComparer
을 구현하려고합니다. 나는 또한 this question을 들여다 보았다. 문제는 LINQ .GroupJoin()
에 IEqualityComparer
을 사용하고 있기 때문에 해결 방법을 사용할 수 없다는 것입니다. 나는 관용을 허용하는 몇 가지 구현을 시도했다. 두 개체가 있기 때문에 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; }
}
GetHashCode()
밖으로 HashTable
를 구축 .GroupJoin()
으로 :
내 최고의 시도는 다음과 같이 보인다. 이것은 작동하지 않습니다.
daysTo는 1 일의 공차 내에서 1 월 5 일과 1 월 6 일과 같이 공차를 추가합니까? 이 평등의 정의는 전이 적이 지 않으므로 모든 객체에 대해 동일한 해시 코드를 반환한다는 간단한 해결책 외의 IEqualityComparer를 사용하여 올바르게 구현할 수 있을지는 의문입니다. –
잊어 버려. 'GroupJoin'을'SelectMany'와 간단한'Where'로 대체하십시오 (별로 좋지는 않지만 작동해야합니다). –
@mikez 네, 그건 공차입니다. 이름이 잘못되었습니다. 이 작업을 할 수 없다면'GroupJoin()'의 커스텀 버젼을 구현할 것입니다. –