Extension Methods: Dictionary

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. Den Anfang machen Extension Methods zum Typ Dictionary.

AddOrUpdate

Wie wohl jedem bekannt ist, muss der Key in einem Dictionary eindeutig sein. Daher gibt es die Methode AddOrUpdate, welche zunächst überprüft, ob es einen Eintrag zu dem Key bereits gibt. Ist dies der Fall, so wird der Eintrag aktualisiert und anderenfalls einfach hinzugefügt. Dadurch stellen wir sicher, dass tatsächlich jeder Key nur einmal im Dictionary vorkommt.

public static void AddOrUpdate<TK, TV>(this Dictionary<TK, TV> dictionary,
    TK key, TV value)
{
    if (dictionary.ContainsKey(key))
        dictionary[key] = value;
    else
        dictionary.Add(key, value);
}

GetValueOrDefault

Versucht man, ohne eine vorherige Überprüfung, ob ein Eintrag zu einem gegebenen Key im Dictionary vorhanden ist, einen Eintrag abzurufen, so wird eine Exception geworfen. Um dies zu umgehen, gibt es die Methode GetValueOrDefault, welche entweder den gespeicherten Wert oder einen Default-Wert zurückgibt. So können wir sicherstellen, dass wir immer einen Wert für jeden gegebenen Key erhalten.

public static TV GetValueOrDefault<TK, TV>(this Dictionary<TK, TV> dictionary,
    TK key, TV defaultValue)
{
    return dictionary.ContainsKey(key)
        ? dictionary[key] 
        : defaultValue;
}

Combine

Manchmal hat man zwei Dictionaries, welche man miteinander kombinieren möchte. Dazu gibt es die Methode Combine, welche ein zweites Dictionary dem ersten Dictionary hinzufügt. Dabei wird überprüft, ob ein Eintrag zu einem Key bereits vorhanden ist und nur wenn dies nicht der Fall ist, wird der Eintrag übernommen.

public static void Combine<TK, TV>(this IDictionary<TK, TV> dictionary,
    IDictionary<TK, TV> secondDictionary)
{
    foreach (var item in secondDictionary)
    {
        if (!dictionary.ContainsKey(item.Key))
            dictionary.Add(item.Key, item.Value);
    }
}

ToPrettyString

Gerade während der Entwicklung ist es vom großen Interesse zu wissen, welche Einträge im aktuellen Dictionary vorliegen. Dafür gibt es die Methode ToPrettyString, welche ein gegebenes Dictionary als String ausgeben kann.

public static string ToPrettyString<TK, TV>(this Dictionary<TK, TV> dictionary)
{
    return "{" + string.Join(", ", 
        dictionary.Select((kvp) => $"{kvp.Key}: {kvp.Value}")) + "}";
}

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 Dictionaries? Dann teilt die doch mit der Community über die Kommentarfunktion zu diesem Beitrag.

Buch-Tipp: Docker Praxiseinstieg von Karl Matthias und Sean P. Kane Mac fernsteuern mit VNC GitHub-Account anlegen und erste Schritte mit Git