【问题标题】:TryGetValue Evaluating to False Even When Key is Present即使存在键,TryGetValue 也会评估为 False
【发布时间】:2018-03-04 07:37:52
【问题描述】:

这个问题和this one基本一样,虽然那个人的问题的答案原来是一个简单的尾随空格。

我的问题是我从 Web API 中检索数据作为字典,然后尝试从中获取值。我正在使用TryGetValue,因为并非字典中的每个项目都必然包含每个键。出于某种原因,虽然我可以毫无问题地获得一个键的值,但对于另一个键 TryGetValue 总是评估为假,因此不会返回该值,即使我可以在调试中看到密钥存在。

因此,此块总是检索“System.Description”键的值(如果存在):

string descriptionValue = "";
if (workItem.Fields.TryGetValue("System.Description", out descriptionValue))
{
    feature.Description = descriptionValue;
}

但是,这个几乎相同的块永远不会检索“CustomScrum.RoadmapGroup”键的值:

int RoadmapGroupValue = 0;
if (workItem.Fields.TryGetValue("CustomScrum.RoadmapGroup", out RoadmapGroupValue))
{
    feature.RoadmapGroup = RoadmapGroupValue;
}

正如您在此屏幕截图中看到的那样,字典确实包含一个名称与我的 TryGetValue 语句完全匹配的键:

如果我在 TryGetValue 语句计算结果为真 (feature.Description = descriptionValue;) 时应该运行的代码上设置断点,则它永远不会被命中。

对于字典中的每个项目,feature.RoadmapGroup 变量都设置为 0。

至少过去两个小时我一直盯着这个看,我看不出我做错了什么。

【问题讨论】:

  • 如果您尝试改用字符串会怎样?字符串 RoadmapGroupValue = "0";
  • @ShakSmith 我试过了,TryGetValue 仍然评估为 false,如果找到密钥,则永远不会运行它应该运行的代码。
  • 字典是如何声明的?它的值的类型是什么?
  • 你能试试workItem.Fields["CustomScrum.RoadmapGroup"] 之类的东西,看看你能不能找回你的价值吗?
  • @Sach 好的,如果我修改我的代码,使字典只包含“CustomScrum.RoadmapGroup”键存在的项目,然后用feature.RoadmapGroup = (int)workItem.Fields["CustomScrum.RoadmapGroup"]; 替换TryGetValue 块,我得到一个@987654336 @ 错误。我正在转换为整数,因为 feature.RoadmapGroup 是一个整数。

标签: c# dictionary trygetvalue


【解决方案1】:

你确定这个“CustomScrum.RoadmapGroup”键是一个字符串吗?如果是,请确保它不包含任何特殊的不可读字符。您可以在调试时复制此值,将其放入 Watch 窗口并检查长度/字节表示,然后对具有相同内容的手写字符串执行相同操作。

【讨论】:

  • 该值不是字符串,而是整数。你是这个意思吗?键名是一个字符串,据我所知 - 可以是别的吗?
  • 我的意思是,您尝试获取值的键可以包含一些不可打印的字符。
【解决方案2】:

这是你的演员出错的场景。

private void foo()
{
    Dictionary<string, object> dict = new Dictionary<string, object>();
    object obj = new object();
    obj = "1";
    dict.Add("CustomScrum.RoadmapGroup", obj);
    object val;
    var result = dict.TryGetValue("CustomScrum.RoadmapGroup", out val);
    int value = (int)val;
}

TryGetValue() 返回true,但最后一行(演员表)抛出System.InvalidCastException: 'Specified cast is not valid.',尽管如果您使用断点查看字典内容,它看起来像可以转换为int。见下文:

所以我相信,当您将值添加到字典时,您添加的并不是真正的 int,而是看起来像 int 的东西。

编辑

我刚刚用int value = Convert.ToInt32(val); 替换了int value = (int)val;,它可以很好地转换值。所以你可能想尝试使用它,看看它是否也有效。

【讨论】:

  • 还有here is an explanation of the differences between the two castings。所以看起来你确实添加了一个非数字变量作为值1,因此你的(int) 转换出错但Convert.ToInt32() 没有。您要么想修正如何将值添加到 Dictionary,要么更好地使用正确的转换函数。
  • 是的,你成功了。我将我的 RoadmapGroupValue 变量声明为 Object 而不是 Integer,然后在 TryGetValue 块中,我按照您的建议将输出值转换为 Int32 并且它可以工作。我仍然认为,如果 Visual Studio 引发类型转换错误,而不是仅仅使用 TryGetValue 语句简单地评估为 FALSE,我可以节省自己的时间,这对我来说似乎是一个小错误。无论如何,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2015-03-15
  • 2015-09-11
相关资源
最近更新 更多