Feedback

C# - LambdaEqualityComparer(T)

Veröffentlicht von am 31.08.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.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

/// <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!