LINQ Where Syntax

本文关键字:Syntax Where LINQ | 更新日期: 2023-09-27 18:02:21

我有以下LINQ来填充html <tr>标签的数据表与htmllagilitypack的帮助,每个标签有一个属性,我需要忽略该标签的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子句里面做错了什么?

LINQ Where Syntax

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

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

看起来您缺少一个lambda,并且其中一个select是无序的。同样,这里也没有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);
}