我怎样才能给字典一个空的键

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。此方法返回truefalse 以指示是否找到了给定的键,并且有一个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

【讨论】:

以上是关于我怎样才能给字典一个空的键的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能扁平化一个字典列表?

我怎样才能只读取我的字典的一个值?

如何“完美”覆盖字典?

将字典的键和值并行传递给函数?

将项目附加到字典 Python

字典到关键字参数解包[重复]