Feedback

C# - Duplikate aus einer IEnumerable<T> entfernen

Veröffentlicht von am 22.06.2009
(2 Bewertungen)
Die beschriebenen Erweiterungsmethoden entfernen äußerst effizient Duplikate aus einer IEnumerable<T> mit Hilfe eines neuen Features in .net 3.5 - dem HashSet<T>.

PS: Für den Denkanstoß des Behaltens der Elementreihenfolge bedanke ich mich bei herbivore.
GFU-Schulungen  [Anzeige]

ASP.NET 2.0 und 3.5

Dieser Kurs vermittelt Ihnen alle Erweiterungen von Microsoft ASP.NET 2.0. Zu diesen zählen u. a. Data Bindung, Master Pages, und Security.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

namespace gfoidl.Extensions
{
	using System.Collections.Generic;
	using System.Linq;
	//-------------------------------------------------------------------------
	/// <summary>
	/// Erweiterungsmethoden für <see cref="IEnumerable&lt;T>"/>
	/// </summary>
	public static class MyIEnumerableExtensions
	{
		/// <summary>
		/// Entfernt Duplikate aus einem <see cref="IEnumerable&lt;T>"/>.
		/// </summary>
		/// <typeparam name="T">
		/// Der Typ der aufzulistenden Objekte.
		/// </typeparam>
		/// <param name="collection">
		/// Die Auflistung.
		/// </param>
		/// <returns>
		/// Auflistung ohne Duplikate.
		/// </returns>
		public static List<T> RemoveDuplicates<T>(this IEnumerable<T> collection)
		{
			return new HashSet<T>(collection).ToList();
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Entfernt Duplikate aus einem <see cref="IEnumerable&lt;T>"/>.
		/// </summary>
		/// <typeparam name="T">
		/// Der Typ der aufzulistenden Objekte.
		/// </typeparam>
		/// <param name="collection">
		/// Die Auflistung.
		/// </param>
		/// <param name="comparer">
		/// Die <see cref="IEqualityComparer&lt;T>"/>-Implementierung, die 
		/// zum Vergleichen von Schlüsseln verwendet werden soll, oder null, 
		/// wenn der Standard-<see cref="EqualityComparer&lt;T>"/> für diesen 
		/// Schlüsseltyp verwendet werden soll.
		/// </param>
		/// <returns>
		/// Auflistung ohne Duplikate.
		/// </returns>
		public static List<T> RemoveDuplicates<T>(
			this IEnumerable<T> collection,
			IEqualityComparer<T> comparer)
		{
			return new HashSet<T>(collection, comparer).ToList();
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Entfernt Duplikate aus einem <see cref="IEnumerable&lt;T>"/>. Die
		/// Reihenfolge der Elemente wird dabei beibehalten.
		/// </summary>
		/// <typeparam name="T">
		/// Der Typ der aufzulistenden Objekte.
		/// </typeparam>
		/// <param name="collection">
		/// Die Auflistung.
		/// </param>
		/// <returns>
		/// Auflistung ohne Duplikate.
		/// </returns>
		public static List<T> RemoveDuplicatesKeepOrder<T>(
			this IEnumerable<T> collection)
		{
			HashSet<T> hashSet = new HashSet<T>();
			List<T> result = new List<T>(collection.Count());

			foreach (T item in collection)
				if (hashSet.Add(item))
					result.Add(item);

			return result;
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Entfernt Duplikate aus einem <see cref="IEnumerable&lt;T>"/>. Die
		/// Reihenfolge der Elemente wird dabei beibehalten.
		/// </summary>
		/// <typeparam name="T">
		/// Der Typ der aufzulistenden Objekte.
		/// </typeparam>
		/// <param name="collection">
		/// Die Auflistung.
		/// </param>
		/// <param name="comparer">
		/// Die <see cref="IEqualityComparer&lt;T>"/>-Implementierung, die 
		/// zum Vergleichen von Schlüsseln verwendet werden soll, oder null, 
		/// wenn der Standard-<see cref="EqualityComparer&lt;T>"/> für diesen 
		/// Schlüsseltyp verwendet werden soll.
		/// </param>
		/// <returns>
		/// Auflistung ohne Duplikate.
		/// </returns>
		public static List<T> RemoveDuplicatesKeepOrder<T>(
			this IEnumerable<T> collection,
			IEqualityComparer<T> comparer)
		{
			HashSet<T> hashSet = new HashSet<T>(comparer);
			List<T> result = new List<T>(collection.Count());

			foreach (T item in collection)
				if (hashSet.Add(item))
					result.Add(item);

			return result;
		}
	}
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!