Extension Methods: Collections

Mit der Hilfe von Extension Methods können wir einem vorhandenen Typen zusätzliche Methoden hinzufügen, ohne einen neuen abgeleiteten Typ zu erstellen und ohne den ursprünglichen Typ bearbeiten zu müssen. Bei Extension Methods handelt es sich um statische Methoden. Im Laufe der Zeit ist eine beachtliche Sammlung an Extension Methods entstanden, welche in den verschiedensten Projekten zum Einsatz kamen und auch immer noch kommen. Ich möchte nun in einer kleinen Serie ein paar Methoden vorstellen, welche vielleicht für den einen oder anderen auch von Interesse sein könnten. Weiter geht es mit Extension Methods zum Typ Collection.

HasItems

Mit der Hilfe von Linq wird eine Methode Any zur Verfügung gestellt, welche verwendet werden kann, um zu überprüfen, ob eine Collection über Einträge verfügt. Wenn allerdings die Collection null ist, so wird eine Exception geschmissen. Daher gibt es mit HasItems eine Kombination aus beiden Tests, um zu überprüfen, ob Einträge in einer Collection vorhanden sind.

public static bool HasItems<T>(this IEnumerable<T> collection)
{
    return collection != null && collection.Any();
}

ToObservableCollection

Manchmal ist es sinnvoll mit einer ObservableCollection zu arbeiten, da diese beispielsweise Events beim Hinzufügen oder Entfernen von Einträgen zur Verfügung steht. Mit der Hilfe der Methode ToObservableCollection lässt sich jede Collection in eine ObservableCollection überführen.

public static ObservableCollection<T> ToObservableCollection<T>(
    this IEnumerable<T> collection)
{
    if (collection == null)
        return new ObservableCollection<T>();

    return new ObservableCollection<T>(collection);
}

AddRange

Zwar bietet eine Collection eine Methode AddRange, um direkt mehrere Einträge hinzufügen zu können, aber die ObservableCollection stellt diese Methode nicht zur Verfügung. Daher gibt es nun ein eigene Implementierung von AddRange, welche diese Funktionalität zur Verfügung stellt.

public static void AddRange<T>(this ObservableCollection<T> targetCollection, 
    IEnumerable<T> sourceCollection)
{
    if (targetCollection == null)
        throw new ArgumentException(nameof(targetCollection));

    if (sourceCollection == null)
        throw new ArgumentException(nameof(sourceCollection));

    foreach (var item in sourceCollection)
        targetCollection.Add(item);
}

GetIndex

Manchmal ist von Interesse zu wissen an welcher Position ein gewisser Eintrag in der Collection ist. Daher ermittelt die Methode GetIndex genau diese Option. Wenn man mit eigenen Datenmodellen arbeitet, sollte man die Methoden Equals und GetHashCode überschreiben, so dass man seine Objekte vergleichen kann.

public static int GetIndex<T>(this IEnumerable<T> collection, 
    T value)
{
    if (collection is IList<T> list)
        return list.IndexOf(value);

    var index = 0;
    foreach (var item in collection)
    {
        if (item.Equals(value))
            return index;

        ++index;
    }

    return -1;
}

In diesem Beitrag habe ich euch einige Extension Methods vorgestellt, welche in verschiedenen Projekten vor mit zum Einsatz gekommen sind oder immer noch kommen. Habt ihr noch weitere Extension Methods für Collections? Dann teilt die doch mit der Community über die Kommentarfunktion zu diesem Beitrag.

Xamarin.Essentials – Plattformübergreifende APIs Heap Size bei Xamarin-Projekten erhöhen Xamarin.Forms Controls: RepeaterView mit DataTemplateSelector