Einige Methoden im .NET Framework (LINQ) akzeptieren als weiteren Parameter einen IEqualityComparer(T).
Über diesen können 2 Elemente aus Listen verglichen werden. Leider lässt sich solch eine Abfrage nicht einfach über einen Lambda-Ausdruck realisieren. Für diese Lücke habe ich die nachfolgende Klasse geschrieben.
Hinweis: Wenn Beispielsweise immer alle Objekte gleich sein sollen, dann muss auch der Hashcode immer gleich sein. Es reicht also nicht aus nur Equal anzupassen.
/// <summary>
/// Vergleicht zwei Objekte gleichen Typs anhand von zwei Methoden.
/// </summary>
/// <typeparam name="T">Der Typ der zu vergleichenden Objekte.</typeparam>
public class LambdaEqualityComparer<T> : EqualityComparer<T>
{
#region .ctor
/// <summary>
/// Erstellt eine neue Instanz der <see cref="LambdaEqualityComparer"/>-Klasse.
/// </summary>
/// <param name="comparer">Die zu verwendende Vergleichsmethode.</param>
/// <param name="hasher">Die zu verwendende Methode zum ermitteln des Hashcodes.</param>
public LambdaEqualityComparer(ComparerMethod<T> comparer, GetHashCodeMethod<T> hasher)
{
this.Comparer = comparer;
this.Hasher = hasher;
}
#endregion
#region Delegaten
/// <summary>
/// Stellt einen Delegaten bereit mit dem zwei Onbjekte gleichen Typs verglichen werden.
/// </summary>
/// <typeparam name="TType">Der Typ von <paramref name="x"/> und <paramref name="y"/>.</typeparam>
/// <param name="x">Das erste Objekt.</param>
/// <param name="y">Das zweite Objekt.</param>
/// <returns><c>True</c>, wenn <paramref name="x"/> und <paramref name="y"/> übereinstimmen. Andernfalls <c>False</c>.</returns>
public delegate bool ComparerMethod<TType>(TType x, TType y);
/// <summary>
/// Stellt einen Delegaten bereit mit dem der zu verwendende Hashcode eines Objekts ermittelt wird.
/// </summary>
/// <typeparam name="TType">Der Typ von <paramref name="x"/>.</typeparam>
/// <param name="x">Das Objekt dessen Hashcode ermittelt werden soll.</param>
/// <returns>Der Hashcode von <paramref name="x"/>.</returns>
public delegate int GetHashCodeMethod<TType>(TType x);
#endregion
#region Eigenschaften
/// <summary>
/// Ruft die Methode zum vergleichen von zwei Objekten ab oder legt diese fest.
/// </summary>
public ComparerMethod<T> Comparer { get; set; }
/// <summary>
/// Ruft die Methode zum ermitteln des Hashcodes ab oder legt diese fest.
/// </summary>
public GetHashCodeMethod<T> Hasher { get; set; }
#endregion
#region Methoden
/// <summary>
/// Vergleicht 2 Objekte anhand der <see cref="Comparer"/>-Methode.
/// </summary>
/// <param name="x">Das erste Objekt.</param>
/// <param name="y">Das zweite Objekt.</param>
/// <returns></returns>
public override bool Equals(T x, T y)
{
return this.Comparer(x, y);
}
/// <summary>
/// Ermittelt den Hashcode eines Objekts anhand der <see cref="Hasher"/>-Methode.
/// </summary>
/// <param name="obj">Das Objekt dessen Hashcode ermittelt werden soll.</param>
/// <returns>Der über <see cref="Hasher"/> ermittelte Hashcode von <paramref name="obj"/>.</returns>
public override int GetHashCode(T obj)
{
return this.Hasher(obj);
}
#endregion
}
Kommentare zum Snippet