C#-比较两个字典(Dictionary>)

我需要检查是否两个字典类型为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
        }
    }
}

当我添加,删除或更改值时,什么也没有发生.仅当更改键或更改计数时,才会显示消息框.这可能与比较字典的功能有关吗?

请记住,每个KeyValuePair的值代表一个通用列表.

解决方法:

未经测试,但我猜以下方法可能有效:

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;

编辑:我添加了一些长度检查.

上一篇:Java:比较两个具有相同值的不同类型的对象,返回true


下一篇:PHP比较对象-奇怪的行为