【问题标题】:Null Exception when using .ToList().ForEach() in C#在 C# 中使用 .ToList().ForEach() 时出现空异常
【发布时间】:2015-10-16 09:23:58
【问题描述】:

我正在使用 HtmlAgilityPack 解析一些数据并编写如下语句以删除不需要的内容 -

doc.DocumentNode.SelectNodes("//ul").ToList().ForEach(a => a.Remove());

当 HTML 文档中存在 <ul> 元素时,这很有效。但是,如果没有 <ul> 元素,则在将其转换为 .ToList() 时会出现 Value cannot by null 异常。

我不想使用以下 -

doc.DocumentNode.SelectNodes("//ul")== null ? null : doc.DocumentNode.SelectNodes("//ul").ToList().ForEach(a => a.Remove());

我有什么优雅的选择?

【问题讨论】:

  • 您认为您提出的解决方案不优雅是什么? (当然,除了它不会编译!-ForEach 是无效的,而另一边的 null 不会合并)
  • @Jamiec,我知道它不会编译,只是想分享我不想写的方式。这种方法在单个标签上使用时是可以的,但是假设我有大约 100 个标签并且我想删除它们。有很多代码要写,我知道我可以把它转换成一个函数,但这也不能正确地为函数提供服务。

标签: c# list


【解决方案1】:

在您的示例中,您调用了两次doc.DocumentNode.SelectNodes("//ul")。有什么问题

var nodes = doc.DocumentNode.SelectNodes("//ul");
if(nodes != null)
   nodes.ToList().ForEach(a => a.Remove());

【讨论】:

  • 真的推荐在 foreach 中删除吗?
  • @Thomas 这是 OP 正在做的事情,而不是问题所在。
  • @Marius,我想知道这是否可以用单个语句编写。请指教。
  • 它可以在 C# 6 中。但声明不应该是你的目标。您的目标应该是正确且简单的代码。
  • 我现在有this answer,@Nitesh 之后还有更多
【解决方案2】:

如果你有可用的 C# 6,你可以使用 Null Conditional Operator

doc.DocumentNode.SelectNodes("//ul")?.ToList().ForEach(a => a.Remove());

【讨论】:

    【解决方案3】:

    我会使用 RemoveAll 而不是 ForEach(如果你可以使用 C#6):

    doc.DocumentNode.SelectNodes("//ul")?.ToList().RemoveAll();
    

    或者

    var nodes = doc.DocumentNode.SelectNodes("//ul");
    if(nodes != null)
        nodes.ToList().RemoveAll();
    

    【讨论】:

      【解决方案4】:

      您需要检查null 条件。

      var docNodes = doc.DocumentNode.SelectNodes("//ul");
      if(docNodes != null)
         docNodes .ToList().ForEach(a => a.Remove());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 2010-12-03
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多