1

我有一个助手,它通过连接's方法将两个或多个IDictionary<TKey, TValue>对象合并为一个,如下所示:IDictionary<TKey, string>TValueToString()

public class DictionaryHelper<TKey, TValue>
{
    public static IDictionary<TKey, string> MergeDictionaries<TKey, TValue>(params IDictionary<TKey, TValue>[] dictionaries) where TValue : class
    {
        var returnValue = new Dictionary<TKey, string>();
        foreach (var dictionary in dictionaries)
        {
            foreach (var kvp in dictionary)
            {
                if (returnValue.ContainsKey(kvp.Key))
                {
                    returnValue[kvp.Key] += kvp.Value.ToString();
                }
                else
                {
                    returnValue[kvp.Key] = kvp.Value.ToString();
                }
            }
        }
        return returnValue;
    }

}

虽然这很简单而且很容易阅读,但似乎应该有一种更有效的方法来做到这一点。有没有?

4

3 回答 3

7

我不知道这是否更有效,但至少它更短:

var result = dictionaries.SelectMany(d => d)
                         .ToLookup(kvp => kvp.Key, kvp => kvp.Value)
                         .ToDictionary(g => g.Key, g => string.Concat(g));
于 2012-05-01T14:07:33.980 回答
1

您可以删除可见 foreachSelectMany

foreach (var kvp in dictionaries.SelectMany(dd => dd))
{
    if (returnValue.ContainsKey(kvp.Key))
    {
        returnValue[kvp.Key] += kvp.Value.ToString();
    }
    else
    {
        returnValue[kvp.Key] = kvp.Value.ToString();
    }
}

你可以进一步扩展它,尽管 dtb 更加优雅和高效

var merged = dictionaries.SelectMany(dd => dd)
                         .GroupBy(kvp => kvp.Key, kvp => kvp.Value)
                         .ToDictionary(
                             gg => gg.Key,
                             gg => String.Concat(gg));

但是,这不太可能比您当前的方法更有效或更易读。

于 2012-05-01T14:06:11.543 回答
0

您可以使用TryGetValue来合并源值的位置和检索。

于 2012-05-01T14:01:11.967 回答