当我尝试从Dictionary键获取值时,它返回错误
我尝试了以下方法:
public Dictionary<string, string> Credentials { get; set; }
Approach1: Credentials["Password"]
+ Credentials [“ 0”]'Credentials [“ 0”]'引发了类型为'System.Collections.Generic.KeyNotFoundException'string的异常 {System.Collections.Generic.KeyNotFoundException}
但是下面的代码按预期工作
Credentials.TryGetValue(Credentials.FirstOrDefault().Key, out string password);
我需要使用出现错误的字典中的键来获取价值。
答案 0 :(得分:4)
这里的问题仅仅是因为您使用了错误的密钥。如果您想知道密钥是什么,请非常仔细查看Credentials.FirstOrDefault().Key
。没有最小的复制,我无法告诉您是什么,但就我个人而言,我怀疑它是尾随空白。
尝试:
var key = Credentials.FirstOrDefault().Key;
Console.WriteLine("'" + key + "'");
此处引号的要点是使多余的空白显而易见。但这并没有得出明显的答案:您需要查看实际的字符数据(ToCharArray()
)-可能存在Unicode恶作剧。
但是键不是"0"
,它只是被视为可枚举的索引。
答案 1 :(得分:1)
问题所声称的内容无法复制。这种基本功能使任何问题在2005年引入Dictionary<>
时就已经注意到。
var Credentials=new Dictionary<string,string>();
Credentials["User"]="2004";
Credentials["Password"]="201900";
Debug.Assert(Credentials["Password"]=="201900");
做什么抛出的东西是
var x=Credentials["0"];
这将正确抛出:
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
因为字典中没有这样的键。
也许正在尝试按索引读取字典项?无论如何,正确的呼叫应该是:
var x=dict.ElementAt(0);
字典的索引器不能用于按索引访问项目。实际上,字典没有任何有意义的顺序。从文档中:
出于枚举目的,字典中的每个项目都被视为代表值及其键的KeyValuePair结构。物品的退还顺序是不确定的。
的顺序可以随着项目添加到索引而改变。