我怎样才能给字典一个空的键
Posted
技术标签:
【中文标题】我怎样才能给字典一个空的键【英文标题】:How can I give a key that's null to the dictionary 【发布时间】:2016-06-08 11:09:43 【问题描述】:我该如何解决这个问题??
给定的键不在字典中
这是错误信息:
在 mscorlib.dll 中发生了“System.Collections.Generic.KeyNotFoundException”类型的未处理异常
附加信息:给定的键不在字典中
预览:http://i.stack.imgur.com/Acu1g.png
static void Main(string[] args)
htmlWeb web = new HtmlWeb();
string url = "http://linsa.softinsa.com/account/login";
HtmlDocument document = web.Load(url);
var head = document.DocumentNode.SelectSingleNode("//head");
var meta = head.SelectNodes("//meta").AsEnumerable();
var link = document.DocumentNode.SelectSingleNode("//head").SelectNodes("//link").AsEnumerable();
var titulo = "" ;
var descricao = "" ;
var linkImg = "" ;
var linkIcon = "" ;
Uri myUri = new Uri(url);
string host = myUri.Host;
var fbProperties = (head.SelectNodes("//meta[contains(@property, 'og:')]") ?? Enumerable.Empty<HtmlNode>())
.ToDictionary(n => n.Attributes["property"].Value, n => n.Attributes["content"].Value);
linkIcon = (head.SelectSingleNode("//link[contains(@rel, 'apple-touch-icon')]")?.Attributes["href"]?.Value) ??
(head.SelectSingleNode("//link[conntains((@rel, 'icon']")?.Attributes["href"]?.Value) ??
host + "/favicon.ico";
var title = head.SelectSingleNode("//title")?.InnerText;
titulo = fbProperties["og:title"] ?? title ?? "";
descricao = fbProperties["og:description"];
linkImg = fbProperties["og:image"];
Console.WriteLine("");
Console.WriteLine("Titulo:");
Console.WriteLine(titulo);
Console.WriteLine("");
Console.WriteLine("Descriçao:");
Console.WriteLine(descricao);
Console.WriteLine("");
Console.WriteLine("Link da Imagem:");
Console.WriteLine(linkImg);
Console.WriteLine("");
Console.WriteLine("Link do Icon:");
Console.WriteLine(linkIcon);
Console.ReadLine();
【问题讨论】:
【参考方案1】:如果你不知道它在那里,你应该使用
ContainsKey:if (fbProperties.ContainsKey("og:title")) ...
或
TryGetValue:fbProperties.TryGetValue("og:title", out value);
【讨论】:
【参考方案2】:当您不确定字典中是否存在给定条目时,您应该使用TryGetValue()
method。此方法返回true
或false
以指示是否找到了给定的键,并且有一个out
参数用于在找到时返回值。 (注意,在字典中找不到键时,out
参数设置为默认值)
请参阅以下示例,其中我已调整“标题”的获取以使用 TryGetValue()
方法:
if (fbProperties.TryGetValue("og:title", out titulo) == false)
// Fall-back to "title" or an empty string when not found in dictionary
titulo = title ?? "";
【讨论】:
【参考方案3】:您需要使用TryGetValue 或ContainsKey 来检查该键是否存在于字典中,然后再尝试使用索引运算符将其取出。
例如:
titulo = fbProperties["og:title"] ?? title ?? "";
变成:
if(fbProperties.TryGetValue("og:title", out titulo) == false || titulo == null)
titulo = (title ?? "");
还有:
escricao = fbProperties["og:description"];
变成
fbProperties.TryGetValue("og:description", out descricao);
如果TryGetValue
找不到密钥,则将descricao
设置为null
。
【讨论】:
以上是关于我怎样才能给字典一个空的键的主要内容,如果未能解决你的问题,请参考以下文章