我有两个字典,我希望比较两个字典键/对值。当我比较它们时,如果第二个字典中的值不同,我想保持它们的配对并将其存储到dictionary3中。
因此,如果我的字典1包含(<1,T><2,T><3,T>
)而2包含(<1,T><2,F><3,T>
),我希望3看起来像(<2,F>
)。
我不知道从哪里开始。我让词典正确地获取了所有数据但是现在我不确定如何设置比较。
private Dictionary<int, bool> CompareDictionaries(Dictionary<int, bool> dic2)
{
Dictionary<int,bool> dictionary3 = new Dictionary<int,bool>();
foreach (KeyValuePair<int, bool> pair in dictionary1)
{
// keep KeyValuePair of dic2
// dictionary3.add(KeyValuePair of dic 2)
}
return dictionary3;
}
对此有任何帮助将不胜感激。我非常肯定我可以用词典来实现我的目标。在我获得第3个字典之后,我将更新表格中的一些信息,然后刷新我正在显示的列表,但这部分更容易,然后找出我需要的这部分方法和算法。任何帮助都一如既往地非常感激。谢谢你们。
答案 0 :(得分:6)
var dict3 = dict2.Except(dict1).ToDictionary(x => x.Key, x => x.Value);
答案 1 :(得分:2)
return dictionary1.Where(kvp => dic2[kvp.Key] != kvp.Value)
.ToDictionary(kvp => kvp.Key, kvp => dic2[kvp.Key]);
如果字典1包含字典2中不存在的任何密钥,则会抛弃。不确定这是否是问题中的预期业务功能。
答案 2 :(得分:1)
这是我的尝试; - )
private Dictionary<int, bool> CompareDictionaries(Dictionary<int, bool> dic1, Dictionary<int, bool> dic2)
{
Dictionary<int, bool> dic3 ;
dic3 = new Dictionary<int, bool>();
foreach (KeyValuePair<int, bool> pair in dic1)
{
// keep KeyValuePair of dic2
if ( ! ((dic2.ContainsKey(pair.Key)) && (dic2[pair.Key] == pair.Value)))
{
dic3.Add(pair.Key, pair.Value);
}
}
return dic3;
}
答案 3 :(得分:1)
我做了类似的事情,但是返回了一个匿名类型而不是一个字典,因为我想清楚地看到增量
var aBeforeDictionary = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"few","less"}, {"curve", "ball"}};
var anAfterDictionary = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"fun", "guy"}, {"few","more"}};
var myBefores = aBeforeDictionary.Except(anAfterDictionary);
var myAfters = anAfterDictionary.Except(aBeforeDictionary);
var affectedKeys = myBefores.Select(aPair => aPair.Key).Union(myAfters.Select(aPair => aPair.Key));
string aValue;
var output = affectedKeys.Select(aKey => new {
Key = aKey,
Before = aBeforeDictionary.TryGetValue(aKey, out aValue) ? aValue : "",
After = anAfterDictionary.TryGetValue(aKey, out aValue) ? aValue : ""
});
output.Dump();
Dump()语法是LinqPad扩展方法。结果如下: