Ich versuche, eine IEqualityComparer
zu implementieren, die eine Toleranz für einen Datumsvergleich aufweist. Ich habe auch in this question geschaut. Das Problem ist, dass ich eine Problemumgehung nicht verwenden kann, da ich die IEqualityComparer
in einem LINQ .GroupJoin()
verwende. Ich habe ein paar Implementierungen ausprobiert, die Toleranz zulassen. Ich kann die Equals()
zu arbeiten, weil ich beide Objekte habe, aber ich kann nicht herausfinden, wie Sie GetHashCode()
implementieren.Verwenden von IEqualityComparer GetHashCode mit einer Toleranz
Mein bester Versuch sieht ungefähr so aus:
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; }
}
Mit .GroupJoin()
ein HashTable
aus dem GetHashCode()
Gebäude es die Tage gilt für beide/alle Objekte hinzuzufügen. Dies funktioniert nicht.
Ist daysTo die Toleranz, wie in Jan 5 entspricht Jan 6 innerhalb einer Toleranz von 1 Tag? Diese Definition von Gleichheit ist nicht transitiv, also bezweifle ich, dass es möglich ist, IEqualityComparer außerhalb der trivialen Lösung des Zurückgebens des gleichen Hash-Codes für jedes Objekt korrekt zu implementieren. –
Vergiss es. Ersetzen Sie die 'GroupJoin' durch' SelectMany' und einfache 'Where' (nicht sehr performant, sollte aber funktionieren). –
@mikez Ja, das ist die Toleranz. Die Benennung ist einfach schlecht. Wenn ich das nicht schaffen kann, werde ich einfach eine benutzerdefinierte Version von 'GroupJoin()' implementieren. –