连接两个字典,以便更新原始的共享密钥

本文关键字:更新 原始 密钥 共享 字典 两个 连接 | 更新日期: 2023-09-27 18:34:40

假设我有两个字典:

Dictionary<string, string> orig = new Dictionary <string, string>();
orig.Add("one", "value one");
orig.Add("two", "");
orig.Add("three", "");
Dictionary<string, string> newDict = new Dictionary <string, string>();
newDict.Add("one", "this value should not be added");
newDict.Add("two", "value two");
newDict.Add("three", "value three");

如何合并两个字典,以便生成的字典仅在相应值为空时更新键?此外,合并不应添加new中存在但orig中不存在的任何键。也就是说,"一"仍然具有值"值一",而"二"和"三"使用new中的值进行更新。

我尝试使用orig.Concat(new);,但这让我只剩下原始字典。也许这可以用 LINQ 完成?

连接两个字典,以便更新原始的共享密钥

尝试:

orig = orig.Keys.ToDictionary(c => c, c=>(orig[c] == "" ? newDict[c] : orig[c]));

此循环高效且可读地执行您想要的操作:

Dictionary<string, string> result = new Dictionary<string, string>();
foreach (var keyVal in orig)
{
    if (!string.IsNullOrEmpty(keyVal.Value))
        result.Add(keyVal.Key, keyVal.Value);
    else
    {
        string val2;
        if (newDict.TryGetValue(keyVal.Key, out val2))
            result.Add(keyVal.Key, val2);
        else
            result.Add(keyVal.Key, "");
    }
}

结果:

one, value one  
two, value two
three, value three

我会使用foreach

foreach (var pair in orig.Where(x=> string.IsNullOrEmpty(x.Value)).ToArray())
{
    orig[pair.Key] = newone[pair.Key];
}
扩展方法

"单行"在帮助澄清意图时非常有用,但对于这样的事情,我倾向于编写一个带有显式循环的小方法,以执行所需的操作。 我认为这比使用各种扩展方法转换创建新字典要干净得多:

    public void PopulateMissingValues(Dictionary<string, string> orig, Dictionary<string, string> newDict)
    {
        foreach (var pair in orig.Where(p => p.Value == string.Empty))
        {
            string newValue;
            if (newDict.TryGetValue(pair.Key, out newValue))
                orig[pair.Key] = newValue;
        }
    }