连接两个字典,以便更新原始的共享密钥
本文关键字:更新 原始 密钥 共享 字典 两个 连接 | 更新日期: 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;
}
}