我有以下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
子句中做错了什么?
答案 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);
}