【发布时间】:2014-12-03 02:06:14
【问题描述】:
我需要检查两个Dictionary<string, List<string>> 类型的字典是否相同。到目前为止,我有这个:
// dictionaries are already defined, so no parameters are required
private bool DictionariesEqual()
{
return dictionary1.SequenceEqual(dictionary2);
}
我假设这只检查键和值的顺序是否相同,这不是我想要的,因为顺序无关紧要,只有每个键和值的名称。
有没有办法检查字典中是否有不相等的字符串,如果发现第一个不匹配则返回 false?
编辑
感谢您的所有帮助,但仍然无法识别值更改。
更具体地说,这里是函数(感谢@juharr)以及我如何使用它:
private bool DictionaryContentChanged()
{
if(synonymDictionary.Count != temporaryDictionary.Count ||
synonymDictionary.Keys.Except(temporaryDictionary.Keys).Any() ||
!synonymDictionary.Join(
temporaryDictionary,
kvp => kvp.Key,
kvp => kvp.Key,
(kvp1, kvp2) => new
{
l1 = kvp1.Value,
l2 = kvp2.Value
})
.All(a => a.l1.Count == a.l2.Count && !a.l1.Except(a.l2).Any()))
return true;
return false;
{
我把它放到了一个更新函数中,该函数以一定的时间间隔反复检查变化:
void Update(int interval)
{
while(!this.IsDisposed)
{
Set.Timer(interval);
if(DictionaryContentChanged())
{
MessageBox.Show("Changes detected");
}
else
{
// move on
}
}
}
当我添加、删除或更改值时,没有任何反应。消息框仅在更改密钥或更改 key.Count 时显示。这可能与比较字典的功能有关吗?
请记住,每个 KeyValuePair 的值代表一个通用 List。
【问题讨论】:
-
请问你为什么不接受我的回答?
-
对不起。这是因为我仓促接受了,当我意识到字典键的变化被注册了,但是当我意识到你的比较看不到值的变化时,我不接受你的回答。
-
列表中的值实际上是字符串还是任意对象?在第一种情况下,我的解决方案应该有效,否则您应该在每种可能的对象类型上实现 Equals(和 GetHashCode)。
-
当然,这两个字典都包含纯字符串和字符串列表。相关类相当大,大约 900 行代码。我想我得再深入研究一下,看看是什么导致了这个问题。
标签: c# string dictionary compare