2

我有以下 LINQ 在 HTMLAgilityPack 的帮助下从 html标签填充数据表,每个标签都有一个属性,如果属性值为“rating-col” <tr>,我需要忽略该标签的。innertext

nodes.Skip(1)
.Select(
tr => tr.Elements("td").
    Select(td => td.InnerText.
        Where(td.Attributes[0].Value != "rating-col")).
        ToArray()).
        ToList().
        ForEach(row => dt.Rows.Add(row));

没有 Where 子句一切正常,我在Where子句中做错了什么?

4

2 回答 2

5

Where(td.Attributes[0].Value != "rating-col"))里面应该有一个 lambda ...例如:

Where(c => c.Attributes[0].Value != "rating-col"))

于 2013-03-06T04:12:13.763 回答
4

看起来您缺少一个 lambda,并且其中一个 Selects 出现故障。ToList()此外,这里没有理由ForEach()。您的ToList()电话使事情变慢并迫使您使用更多内存。您需要它的唯一原因是获取ForEach()扩展名,这并不能真正为您节省任何通过正常foreach循环的东西。另外,虽然我不是该领域的专家,但我知道该ForEach()扩展的功能风格很差,因为它几乎假定您正在引起副作用(一个很大的功能禁忌)。由于 linq 深受函数式编程范式的启发,因此我尝试关注这些事情。

foreach (var row in nodes.Skip(1)
     .Select(tr => tr.Elements("td")
         .Where(td => td.Attributes[0].Value != "rating-col")
         .Select(td => td.InnerText)
         .ToArray()))
{
    dt.Rows.Add(row);
}
于 2013-03-06T04:23:25.050 回答