即使Key存在,TryGetValue也会评估为False

时间:2017-09-22 16:43:40

标签: c# dictionary trygetvalue

这个问题与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语句完全匹配的键: enter image description here

如果我在TryGetValue语句求值为true(feature.Description = descriptionValue;)时应该运行的代码上设置断点,那么它永远不会被命中。

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

我至少在过去的两个小时里一直盯着这个,我无法看清我做错了什么。

2 个答案:

答案 0 :(得分:1)

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

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。见下文:

enter image description here

因此,我相信当您将值添加到字典中时,您并未真正添加int,而是看起来像int

修改

我刚刚将int value = (int)val;替换为int value = Convert.ToInt32(val);,它可以很好地转换价值。所以你可能想尝试使用它,看看它是否也能正常工作。

答案 1 :(得分:0)

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