我需要检查两个类型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;
{
我将它放入一个Update函数中,该函数以一定的间隔重复检查更改:
void Update(int interval)
{
while(!this.IsDisposed)
{
Set.Timer(interval);
if(DictionaryContentChanged())
{
MessageBox.Show("Changes detected");
}
else
{
// move on
}
}
}
当我添加,删除或更改值时,没有任何反应。只有在更改密钥或更改key.Count时,才会显示消息框。这可能与比较词典的功能有关吗?
请记住,每个KeyValuePair的值代表一个通用列表。
答案 0 :(得分:3)
未经测试,但我猜以下情况可能有效:
if (dictionary1.Count != dictionary2.Count) return false;
foreach (var kv in dictionary1) {
if (!dictionary2.ContainsKey(kv.Key) return false;
List list = dictionary2[kv.Key];
if (!list.Count != dictionary1[kv.Key].Count) return false;
foreach(var value in kv.Value) {
if(!list.Contains(value)) return false;
}
}
return true;
编辑:我添加了一些长度检查。
答案 1 :(得分:1)
这是一个Linq版本
dic1.Count == dic2.Count &&
!dic1.Keys.Except(dic2.Keys).Any() &&
dic1.Join(
dic2,
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())
首先,它确保字典具有相同数量的项目,然后确保它们具有相同的键。然后它将它们连接到它们的键上,并确保具有相同键的所有列表具有相同的计数和相同的内容。
修改强>
以下是获得相反返回值的一些方法。
用()包裹整个东西然后放一个!在前面。
!(dic1.Count == dic2.Count &&
!dic1.Keys.Except(dic2.Keys).Any() &&
dic1.Join(
dic2,
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()))
如果您分发了not,那么请注意,您必须将ands(&&
)更改为ors(||
)。
dic1.Count != dic2.Count ||
dic1.Keys.Except(dic2.Keys).Any() ||
!dic1.Join(
dic2,
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())
这基于De Morgan's Law表明
Not(A And B) = Not A Or Not B
另一个选择是将您的方法从DictionaryContentChanged
更改为DictionaryContentSame
,如果需要,只需在您使用它的地方取消它。
答案 2 :(得分:-1)
对两个词典进行排序并进行比较
bool result2 = dictionary1.OrderBy(r=>r.Key).SequenceEqual(dictionary2.OrderBy(r=>r.Key));