C# LINQ何处语法

C# LINQ何处语法,c#,linq,html-agility-pack,C#,Linq,Html Agility Pack,我有下面的LINQ,在HtmlAlityPack的帮助下从html标记填充数据表,每个标记都有一个属性,如果属性值为“rating col”,我需要忽略该标记的innertext 如果没有Where子句,那么在Where子句中我做错了什么?Where(td.Attributes[0].Value!=“rating col”)应该包含lambda…例如: 其中(c=>c.Attributes[0].Value!=“rating col”)看起来您缺少了一个lambda,其中一个选项出现了故障。此外

我有下面的LINQ,在HtmlAlityPack的帮助下从html
标记填充数据表,每个标记都有一个属性,如果属性值为“rating col”,我需要忽略该标记的
innertext

如果没有Where子句,那么在
Where
子句中我做错了什么?

Where(td.Attributes[0].Value!=“rating col”)
应该包含lambda…例如:


其中(c=>c.Attributes[0].Value!=“rating col”)

看起来您缺少了一个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);
}

如果可以,请编辑并添加您的异常或错误。不清楚您是要跳过每行中的一列,还是要跳过表中的某些行。其中(td=>td.Attributes[0].Value!=“rating col”)@DotNetDreamer:OP无法使用
td
。它是一个内部的
,其中
,并将重新定义
td
“每个标记都有一个属性…”这似乎是一个非常脆弱的测试:您依赖于属性的确切数量/位置来实现逻辑。为什么不使用特定的命名属性,直接将其作为目标?如果这不在您的控制范围内,那么您可能应该在所有属性中查找“rating col”,如果需要这样做的话,以防添加其他属性。它还需要位于select之前。@RaymondChen是这样做的;)@user1590636我希望你能理解为什么。@RaymondChen起初我不知道,但现在我知道了:D这个功能会更快吗?:应该是。它使您不必在元素上循环两次。当前代码必须循环一次以创建列表,然后在创建列表后再次循环以将这些元素复制到datatable(加上保存临时列表的额外内存)。这避免了所有这些。它只循环一次,一次只保存内存中的一行数组。它还可以为不会生成最终结果的列保存引用InnerText属性的工作。
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);
}