IEqualityComparer
を実装しようとしていますが、これは日付比較の許容差があります。私もthis questionを見てきました。問題は、LINQ .GroupJoin()
にIEqualityComparer
を使用しているため、回避策を使用できないことです。私は公差を許容するいくつかの実装を試みました。私は両方のオブジェクトを持っているのでEquals()
を得ることができますが、実装する方法を理解できませんGetHashCode()
。それは両方の/すべてのオブジェクトに追加し日間適用されるGetHashCode()
のうちHashTable
を構築.GroupJoin()
で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; }
}
:
私の最高の試みは、次のようになります。これは機能しません。
daysToは1日の許容値内で1月5日が1月6日と同じように許容範囲を追加しますか?この等価性の定義は推移的ではないので、すべてのオブジェクトに対して同じハッシュコードを返す簡単な解決策の外で、IEqualityComparerを使用して正しく実装することは可能であるとは思わない。 –
それを忘れてしまった。 'GroupJoin'を' SelectMany'と単純な 'Where'で置き換えます(それほどパフォーマンスは良くないが動作するはずです)。 –
@mikezはい、それは公差です。名前はちょうど悪いです。私がこの作業をすることができなければ、 'GroupJoin()'のカスタム版を実装するだけです。 –