C# Merging 2 dictionaries

Viewed 36618

I'm developing an app in C# targeting .NET 3.5. In it, I have 2 similar dictionaries that contain validation criteria for a specific set of elements in my app. Both dictionaries have identical signatures. The first dictionary has the default settings and the 2nd dictionary contains some user defined settings.

var default_settings = new Dictionary<string, MyElementSettings>();
var custom_settings = new Dictionary<string, MyElementSettings>();

I would like to combine the 2 dictionaries into one that contains the elements of both dictionaries.

The problem that I am running into is it is possible for both dictionaries to have the some of the same key values. The basic rule I want is to have a combination of both dictionary and if there are any keys in the custom_settings that already exist in the default_settings, the custom_settings value will overwrite the default_settings value. The best solution i have is just a foreach loop, check if the key exists in the other dictionary, and if not, add it.

foreach (var item in custom_settings)
{
    if (default_settings.ContainsKey(item.Key))
        default_settings[item.Key] = item.Value;
    else
        default_settings.Add(item.Key, item.Value);
}

I've done some basic LINQ queries, but I'm still working on learning the more advanced stuff. I've seen a few queries that will merge 2 dictionaries, but most involve grouping any element with duplicate keys, or only return a collection with just the duplicate keys/ Is there a LINQ query or expression that will mimic the behavior of the foreach loop I am using?

5 Answers

This version creates a new entire dictionary instead of modifying one the dictionaries and merges the current dictionary with the supplied dictionary.

/// <summary>
/// Merges the current dictionary with the supplied dictionary into a new dictionary.
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="current"></param>
/// <param name="keyValuePairs"></param>
/// <returns></returns>
public static IDictionary<TKey, TValue> Merge<TKey, TValue>(this IDictionary<TKey, TValue> current, IDictionary<TKey, TValue> keyValuePairs)
{
    var dictionaryMerge = new Dictionary<TKey, TValue>(current);
    foreach (var item in keyValuePairs)
    {
        dictionaryMerge[item.Key] = item.Value;
    }
    return dictionaryMerge;
}

Related