Feedback

C# - Duplikate aus einer IEnumerable<T> entfernen

Veröffentlicht von am 6/22/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.
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!