Wenn man bei Auflistungen die Count()-Methode verwendet, werden erst alle Elemente durch gegangen. Das ist sehr aufwendig, wenn man eine große Auflistung hat.
Die im Snippet gezeigten Methoden prüfen ob eine Mindestanzahl an Elementen vorhanden ist. D.h. dass das Zählen beim erreichen der Prüfzahl abgebrochen wird. Die 2. Überladung nimmt eine Auswahlfunktion entgegen.
HinweisAlternativen wie Array.Length sind oftmals schneller. Ggf. kann eine Messung der Ausführungszeit bei der Entscheidung helfen.
Benötigte NamespacesSystem
System.Collections.Generic
MSDN ArtikelIEnumable<T>
http://msdn.microsoft.com/de-de/library/9eekhta0.aspx
UpdateWie in den Kommentaren von Xilefius vorgeschlagen braucht man diese Methoden nicht zwingend, folgende Aufrufe funktionieren genauso:
someList.Take(minCount).Count() == minCount
someList.Where(predicate).Take(minCount).Count() == minCount
/// <summary>
/// Überprüft ob die Auflistung eine Mindestzahl an Elementen aufweißt.
/// </summary>
/// <typeparam name="TSource">Der Typ der Elemente in der Auflistung.</typeparam>
/// <param name="list">Die Auflistung.</param>
/// <param name="count">Die Anzahl, bei der geprüft werden soll, ob mindestens so viele in <paramref name="list"/> enthalten sind.</param>
/// <returns><c>True</c>, wenn <paramref name="list"/> nicht <c>NULL</c> ist mindestens <paramref name="count"/> Elemente enthält. Andernfalls <c>False</c>.</returns>
/// <exception cref="System.ArgumentOutOfRangeException">Wird ausgelöst, wenn <paramref name="count"/> kleiner als 0 ist.</exception>
public static bool HasCount<TSource>(this IEnumerable<TSource> list, int count)
{
if (list == null)
return false;
if (count < 0)
throw new ArgumentOutOfRangeException("count");
if (count == 0)
return true;
using (var enumerator = list.GetEnumerator())
{
while (count > 0 && enumerator.MoveNext())
--count;
}
if (count == 0)
return true;
return false;
}
/// <summary>
/// Überprüft ob die Auflistung eine Mindestzahl an Elementen aufweißt.
/// </summary>
/// <typeparam name="TSource">Der Typ der Elemente in der Auflistung.</typeparam>
/// <param name="list">Die Auflistung.</param>
/// <param name="count">Die Anzahl, bei der geprüft werden soll, ob mindestens so viele in <paramref name="list"/> enthalten sind.</param>
/// <param name="predicate">Eine Funktion, mit der geprüft wird, ob ein Element mit gezählt wird.</param>
/// <returns><c>True</c>, wenn <paramref name="list"/> nicht <c>NULL</c> ist mindestens <paramref name="count"/> Elemente enthält. Andernfalls <c>False</c>.</returns>
/// <exception cref="System.ArgumentOutOfRangeException">Wird ausgelöst, wenn <paramref name="count"/> kleiner als 0 ist.</exception>
/// <exception cref="System.ArgumentNullException">Wird ausgelöst, wenn <paramref name="predicate"/> nicht zugewiesen wurde.</exception>
public static bool HasCount<TSource>(this IEnumerable<TSource> list, int count, Func<TSource, bool> predicate)
{
if (list == null)
return false;
if (count < 0)
throw new ArgumentOutOfRangeException("count");
if (predicate == null)
throw new ArgumentNullException("predicate");
if (count == 0)
return true;
using (var enumerator = list.GetEnumerator())
{
while (count > 0 && enumerator.MoveNext())
if (predicate(enumerator.Current))
--count;
}
if (count == 0)
return true;
return false;
}
6 Kommentare zum Snippet