LINQ Where语法

时间:2013-03-06 04:09:21

标签: c# linq html-agility-pack

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

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子句中做错了什么?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

看起来你错过了一个lambda,而且其中一个选择发生了故障。此外,此处没有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);
}