比较两个有序词典

时间:2016-06-21 09:04:56

标签: c# dictionary ordereddictionary

背景

我在网格中更新值时创建了两个有序词典(旧值和新值)。然后,我想比较哪些值不同,并对我的数据源进行更改,这恰好是一个列表。

代码

这是我创建的用于比较类型为Dictionary<string,T>

的两个词典的方法
private Dictionary<string, string> FindChangedValues(OrderedDictionary newValues, OrderedDictionary oldValues)
{
    Dictionary<string, string> _dictKPVtoUpdate = new Dictionary<string, string>();

    foreach (KeyValuePair<string, string> newItem in newValues)
    {
        foreach (KeyValuePair<string, string> oldItem in oldValues)
        {
            if (newItem.Key == oldItem.Key)
            {
                if (!newItem.Value.ToString().Equals(oldItem.Value.ToString(), StringComparison.InvariantCultureIgnoreCase))
                {
                    _dictKPVtoUpdate.Add(oldItem.Key, newItem.Value);

                }
            }
        }
    }

    return _dictKPVtoUpdate;
}

问题

我似乎无法将字典的值转换为字符串,从而获得以下异常。

  

指定的演员表无效。

在这一行

foreach (KeyValuePair<string, string> newItem in newValues)

问题

有没有更好的方法来获取两个有序词典之间的更改?

如何将每个值转换为字符串以进行比较,或者有没有方法可以比较它们,而不进行转换?

编辑:

答案

我指的是KeyValuePair而不是DictionaryEntry

将代码更改为以下内容,问题已解决。

更改了代码

private Dictionary<string, string> FindChangedValues(OrderedDictionary newValues, OrderedDictionary oldValues)
{
    Dictionary<string, string> _dictKPVtoUpdate = new Dictionary<string, string>();

    foreach (DictionaryEntry newItem in newValues)
    {
        foreach (DictionaryEntry oldItem in oldValues)
        {

            if (newItem.Key.ToString() == oldItem.Key.ToString())
            {
                if (!newItem.Value.ToString().Equals(oldItem.Value.ToString(), StringComparison.InvariantCultureIgnoreCase))
                {
                    _dictKPVtoUpdate.Add(oldItem.Key.ToString(), newItem.Value.ToString());

                }
            }
        }
    }

    return _dictKPVtoUpdate;
}

2 个答案:

答案 0 :(得分:2)

DictionaryEntry而不是OrderedDictionary中使用了KeyValuePair。转换为DictionaryEntry并使用其Key / Value属性。

  

每个元素都是存储在DictionaryEntry对象中的键/值对。   密钥不能为空,但值可以是。

OrderedDictionary/Remarks

答案 1 :(得分:1)

迭代字典效率低下。 我会利用字典哈希并像这样实现它:

            Dictionary<string, string> _dictKPVtoUpdate = new Dictionary<string, string>();
        OrderedDictionary newValues =new OrderedDictionary();
        OrderedDictionary oldValues = new OrderedDictionary();

        foreach (DictionaryEntry tmpEntry in newValues)
        {
            if (oldValues.Contains(tmpEntry.Key))
            {
                _dictKPVtoUpdate.Add(tmpEntry.Key.ToString(),tmpEntry.Value.ToString());
            }
        }