LINQ Wo Syntax

c# html-agility-pack linq

Frage

Ich habe die folgende LINQ, um eine Datentabelle von html <tr> -Tags mit Hilfe von HTMLAgilityPack zu füllen, jedes Tag hat ein Attribut und ich muss den innertext dieses Tags ignorieren, wenn der Attributwert "rating-col" ist.

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));

Ohne die Where-Klausel funktionieren die Dinge gut, was mache ich falsch innerhalb der Where Klausel?

Akzeptierte Antwort

Sieht so aus, als ob du ein Lambda vermisst hast und dass eines der Selects nicht in Ordnung war. Auch hier gab es keinen Grund für ToList() oder ForEach() . Ihr Aufruf von ToList() die Dinge langsamer gemacht und Sie gezwungen, mehr Speicher zu verwenden. Der einzige Grund, warum Sie es brauchen, ist die ForEach() Erweiterung, und das spart Ihnen hier wirklich nichts über eine normale foreach Schleife. Außerdem, obwohl ich kein Experte auf diesem Gebiet bin, muss ich verstehen, dass die ForEach() Erweiterung einen schlechten funktionalen Stil hat, weil es fast davon ausgeht, dass Sie Nebenwirkungen verursachen (ein großes funktionelles No-No). Da linq stark vom Paradigma der funktionalen Programmierung inspiriert ist, versuche ich, auf solche Dinge zu achten.

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);
}

Beliebte Antwort

Where(td.Attributes[0].Value != "rating-col")) ein Lambda enthalten sollte ... wie zum Beispiel:

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum