我在网格中更新值时创建了两个有序词典(旧值和新值)。然后,我想比较哪些值不同,并对我的数据源进行更改,这恰好是一个列表。
这是我创建的用于比较类型为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;
}
答案 0 :(得分:2)
在DictionaryEntry
而不是OrderedDictionary
中使用了KeyValuePair
。转换为DictionaryEntry
并使用其Key
/ Value
属性。
每个元素都是存储在DictionaryEntry对象中的键/值对。 密钥不能为空,但值可以是。
答案 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());
}
}