即使存在密钥,TryGetValue 也会评估为 False
TryGetValue Evaluating to False Even When Key is Present
这个问题和基本一样,虽然那个人问题的答案竟然是一个简单的尾随space.
我的问题是我正在从网络 API 中检索数据作为字典,然后尝试从中获取值。我正在使用 TryGetValue
因为不是字典中的每个项目都必须包含每个键。出于某种原因,虽然我可以毫无问题地获得一个键的值,但另一个键 TryGetValue
的计算结果总是为 false,因此 return 没有值,即使我可以在调试中看到密钥存在。
因此,此块始终检索“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。
至少过去两个小时我一直盯着这个看,我看不出我做错了什么。
你确定这个 "CustomScrum.RoadmapGroup" 键是一个字符串吗?如果是,则确保它不包含任何特殊的不可读字符。您可以在调试时复制此值,将其放入 Watch window 并检查 length/bytes 表示,然后对具有相同内容的手写字符串执行相同的操作.
这是一个你的转换出错的场景。
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()
returns true
,但最后一行(强制转换)抛出 System.InvalidCastException: 'Specified cast is not valid.'
,尽管如果你使用断点来查看字典内容它 看起来像 你有一些东西可以转换成int
。见下文:
所以我相信,当您将值添加到字典时,您实际上并不是在添加 int
,而是看起来像 int
.
的东西
编辑
我刚刚将 int value = (int)val;
替换为 int value = Convert.ToInt32(val);
,这样就可以很好地转换值。所以你可能想尝试使用它,看看它是否也有效。
这个问题和
我的问题是我正在从网络 API 中检索数据作为字典,然后尝试从中获取值。我正在使用 TryGetValue
因为不是字典中的每个项目都必须包含每个键。出于某种原因,虽然我可以毫无问题地获得一个键的值,但另一个键 TryGetValue
的计算结果总是为 false,因此 return 没有值,即使我可以在调试中看到密钥存在。
因此,此块始终检索“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。
至少过去两个小时我一直盯着这个看,我看不出我做错了什么。
你确定这个 "CustomScrum.RoadmapGroup" 键是一个字符串吗?如果是,则确保它不包含任何特殊的不可读字符。您可以在调试时复制此值,将其放入 Watch window 并检查 length/bytes 表示,然后对具有相同内容的手写字符串执行相同的操作.
这是一个你的转换出错的场景。
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()
returns true
,但最后一行(强制转换)抛出 System.InvalidCastException: 'Specified cast is not valid.'
,尽管如果你使用断点来查看字典内容它 看起来像 你有一些东西可以转换成int
。见下文:
所以我相信,当您将值添加到字典时,您实际上并不是在添加 int
,而是看起来像 int
.
编辑
我刚刚将 int value = (int)val;
替换为 int value = Convert.ToInt32(val);
,这样就可以很好地转换值。所以你可能想尝试使用它,看看它是否也有效。