Feedback

C# - LambdaEqualityComparer(T)

Veröffentlicht von am 8/31/2013
(0 Bewertungen)
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

 

Logge dich ein, um hier zu kommentieren!