快速批量更新字典

| 我有一个
Dictionary<int, int>
,并想根据它们的当前值一次更新所有某些元素,例如将所有值为10的元素更改为值为14或类似的值。 我以为使用LINQ / lambda东西会很容易,但是似乎并不像我想的那么简单。我当前的方法是这样的:
List<KeyValuePair<int, int>> kvps = dictionary.Where(d => d.Value == oldValue).ToList();
foreach (KeyValuePair<int, int> kvp in kvps)
{
   dictionary[KeyValuePair.Key] = newValue;
}
问题在于
dictionary
非常大(成千上万个元素),并且我在循环中运行此代码数千次,因此它的运行速度非常慢。肯定有更好的办法...     
已邀请:
这可能是错误的数据结构。您正在尝试根据字典条目的值查找字典条目,这与通常的模式相反。也许您可以存储当前映射到某些值的键集。然后,您可以快速移动这些集合,而不必分别更新每个条目。     
我会考虑编写自己的集合类型来实现这一点,即具有相同值的键实际上共享相同的值实例,以便在一处更改它会更改所有键。 类似于以下内容(显然,这里省略了许多代码-仅出于说明目的):
public class SharedValueDictionary : IDictionary<int, int>
{
   private List<MyValueObject> values;

   private Dictionary<int, MyValueObject> keys;

   // Now, when you add a new key/value pair, you actually
   // look in the values collection to see if that value already
   // exists. If it does, you add an entry to keys that points to that existing object
   // otherwise you create a new MyValueObject to wrap the value and add entries to
   // both collections.
}
这种情况将需要versions4ѭ和
Remove
的多个版本,以允许将所有键都更改为相同的值,将一组键中的仅一个键更改为新值,删除具有相同值的所有键,并从值集中仅删除一个键。在需要时为这些场景编写代码应该不难。     
您需要生成一个新词典:
d = d.ToDictionary(w => w.Key, w => w.Value == 10 ? 14 : w.Value)
    
我认为每个人都必须缺少的是,它实在是微不足道的:
List<int> keys = dictionary.Keys.Where(d => d == oldValue);
您不是按值查找键(就像其他人提供的那样)。 相反,按定义,
keys.SingleOrDefault()
现在将返回等于
oldValue
的单个键(如果字典中存在的话)。因此,整个代码应简化为
if (dictionary.ContainsKey(oldValue))
   dictionary[key] = newValue;
很快现在,我有点担心这确实不是OP的意图,而是他所写的。因此,如果现有代码可以满足他的要求,那么他现在将拥有一个高性能的版本:)     
编辑之后,这似乎是立即的改进:
foreach (var kvp in dictionary.Where(d => d.Value == oldValue))
{
   kvp.Value = newValue;
}
我很确定您可以直接更新kvp,只要密钥不变     

要回复问题请先登录注册