【问题标题】:What is the correct way to update a dictionary's value when using TryGetValue?使用 TryGetValue 时更新字典值的正确方法是什么?
【发布时间】:2020-06-03 13:25:57
【问题描述】:

我有一本IDictionary<string, LoadingProgressState> 类型的字典

我正在做的是在调用某些函数时更新字典的Value 的属性。

if(CurrentFilesProgress.TryGetValue(key, out var loadingProgress))
{
    loadingProgress.DoneLoadings = doneLoadings;
    CurrentFilesProgress[key] = loadingProgress;
}

我这样做正确吗?如果没有,更新a的正确方法是什么 字典值的属性?
请注意,我不想创建LoadingProgressState 的新实例,我只想更新它的DoneLoadings 属性。

【问题讨论】:

  • 假设loadingProgress 是一个引用类型(根据上下文判断),您不必在字典中再次保存它。您获得参考,然后更改其属性之一;你实际上并没有复制对象。
  • 分配是不必要的;变量 loadingProgress 是字典和本地变量共享的引用。因此,当您更改 loadingProgress.DoneLoadings 时,您也因此更改了 CurrentFilesProgress[key],因为它们是同一个变量。
  • 所以把CurrentFilesProgress[key] = loadingProgress;去掉就好了?
  • 是的,应该不错。我建议您阅读参考与值类型,这是一个有趣的话题。
  • 我的错,以为你的问题出在引用类型上。这是out keyword 文档。

标签: c# dictionary generics


【解决方案1】:

您可以使用以下代码优化您的代码:

if(CurrentFilesProgress.TryGetValue(key, out var loadingProgress))
{
   loadingProgress.DoneLoadings = doneLoadings;
}

原因是您正在处理的对象与字典中的对象具有相同的引用。

【讨论】:

    【解决方案2】:

    您可以检查字典是否包含键,如果是,则更新其值的属性,如下所示:

    if(CurrentFilesProgress.ContainsKey(key))
    {
        CurrentFilesProgress[key].DoneLoadings = doneLoadings;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-09
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多