C# 即使存在密钥,TryGetValue也将评估为False

C# 即使存在密钥,TryGetValue也将评估为False,c#,dictionary,trygetvalue,C#,Dictionary,Trygetvalue,这个问题基本上与相同,尽管那个人的问题的答案是一个简单的尾随空格 我的问题是,我从web API中检索数据作为字典,然后尝试从中获取值。我使用的是TryGetValue,因为字典中的每一项都不一定包含每一个键。出于某种原因,虽然我可以在一个键存在时毫无问题地获取该键的值,但对于另一个键,TryGetValue的计算结果总是为false,因此不会返回该值,即使我可以在调试中看到该键存在 因此,如果存在“System.Description”键,则此块始终检索该键的值: string descrip

这个问题基本上与相同,尽管那个人的问题的答案是一个简单的尾随空格

我的问题是,我从web API中检索数据作为字典,然后尝试从中获取值。我使用的是
TryGetValue
,因为字典中的每一项都不一定包含每一个键。出于某种原因,虽然我可以在一个键存在时毫无问题地获取该键的值,但对于另一个键,
TryGetValue
的计算结果总是为false,因此不会返回该值,即使我可以在调试中看到该键存在

因此,如果存在“System.Description”键,则此块始终检索该键的值:

string descriptionValue = "";
if (workItem.Fields.TryGetValue("System.Description", out descriptionValue))
{
    feature.Description = descriptionValue;
}
但是,这个几乎相同的块从不检索“CustomScrum.Roadmap组”键的值:

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

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

对于字典中的每一项,
feature.roadmagroup
变量都设置为0


在过去的两个小时里,我一直在关注这个问题,但我看不出我做错了什么。

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

以下是您的强制转换出错的场景

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;
}
private void foo()
{
Dictionary dict=新字典();
object obj=新对象();
obj=“1”;
dict.Add(“CustomScrum.Roadmagroup”,obj);
对象val;
var结果=dict.TryGetValue(“CustomScrum.Roadmap Group”,out val);
int值=(int)val;
}
TryGetValue()
返回
true
,但最后一行(强制转换)抛出
System.InvalidCastException:“指定的强制转换无效。”
,尽管如果使用断点查看字典内容,看起来您有可以转换为
int
的内容。见下文:

所以我相信,当你向字典中添加值时,你实际上并不是在添加一个
int
,而是一个看起来像
int
的东西

编辑


我刚刚替换了
int value=(int)val带有
int值=转换为32(val)它可以很好地转换值。因此,您可能想尝试使用它,看看它是否也能正常工作。

如果您尝试使用字符串,会怎么样?字符串groupvalue=“0”@ShakSmith我试过了,
TryGetValue
的计算结果仍然为false,如果它找到了键,就不会运行它应该运行的代码。字典是如何声明的?它的值的类型是什么?您可以尝试类似于
workItem.Fields[“CustomScrum.Roadmap Group”]
的方法,看看是否可以检索您的值吗?@Sach Ok,如果我修改代码,使字典只包含“CustomScrum.Roadmap Group”中键存在,然后将
TryGetValue
块替换为
feature.roadmagroup=(int)workItem.Fields[“CustomScrum.roadmagroup”],我得到一个
SystemInvalidCastException
错误。我将强制转换为整数,因为feature.Roadmap组是整数。该值不是字符串,而是整数。这就是你的意思吗?据我所知,键名是一个字符串-它还能是其他的吗?我的意思是,你试图获取值的键可以包含一些不可打印的字符。和。看起来您确实添加了一个非数值变量作为值
1
,因此您的
(int)
强制转换出错,但
Convert.ToInt32()
没有。你要么想修正如何将值添加到
字典中
,要么最好使用正确的强制转换函数。是的,你搞定了。我将Roadmap GroupValue变量声明为一个对象,而不是一个整数,然后在
TryGetValue
块中,我按照您的建议将输出值转换为Int32,它就可以工作了。我仍然认为,如果VisualStudio抛出了一个类型转换错误,而不是仅仅使用
TryGetValue
语句(简单地计算为FALSE),我就可以节省自己几个小时,这对我来说似乎是个小错误。无论如何,谢谢你的帮助!
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;
}