如何在扩展方法中更新字典元素?

时间:2013-02-28 22:00:32

标签: c# dictionary merge updates

我正在尝试为我的字典编写合并扩展方法。

我非常喜欢solution Merging dictionaries in C#

我正在尝试修改上述解决方案,以便在密钥退出时更新字典项。我不想使用Concurrent字典。有什么想法吗?

public static void Merge<TKey, TValue>(this IDictionary<TKey, TValue> first, IDictionary<TKey, TValue> second)
        {
            if (second == null) return;
            if (first == null) first = new Dictionary<TKey, TValue>();
            foreach (var item in second)
            {
                if (!first.ContainsKey(item.Key))
                {
                    first.Add(item.Key, item.Value);
                }
                else
                {
                    **//I Need to perform following update . Please Help
                   //first[item.Key] = first[item.key] + item.Value**
                }
            }
        }

1 个答案:

答案 0 :(得分:4)

好吧,如果你想让结果包含两个值,你需要一些方法来组合它们。如果要“添加”值,则需要定义一些组合两个项的方法,因为您无法知道TValue是否定义了+运算符。一种选择是将其作为代理传递:

public static void Merge<TKey, TValue>(this IDictionary<TKey, TValue> first
    , IDictionary<TKey, TValue> second
    , Func<TValue, TValue, TValue> aggregator)
{
    if (second == null) return;
    if (first == null) throw new ArgumentNullException("first");
    foreach (var item in second)
    {
        if (!first.ContainsKey(item.Key))
        {
            first.Add(item.Key, item.Value);
        }
        else
        {
           first[item.Key] = aggregator(first[item.key], item.Value);
        }
    }
}

调用它看起来像:

firstDictionary.Merge(secondDictionary, (a, b) => a + b);

虽然像这样的Merge操作也常常选择要保留的两个项目之一,或者第一个或第二个(注意你可以使用上面的函数,使用适当的aggregator实现)。

例如,要始终将项目保留在您可以使用的第一个字典中:

firstDictionary.Merge(secondDictionary, (a, b) => a);

要始终用第二个替换它:

firstDictionary.Merge(secondDictionary, (a, b) => b);