LINQ Où syntaxe

c# html-agility-pack linq

Question

J'ai le LINQ suivant pour remplir une balise datatable à partir de balises html <tr> à l'aide de HTMLAgilityPack, chaque balise a un attribut et je dois ignorer le innertext de cette balise si la valeur de l'attribut est "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));

sans la clause Where, tout se passe bien, qu'est-ce que je fais de mal dans la clause Where ?

Réponse acceptée

On dirait qu'il vous manque un lambda et que l'un des Select était en panne. En outre, il n'y avait aucune raison pour ToList() ou ForEach() ici. Votre appel à ToList() a ralenti les choses et vous a obligé à utiliser plus de mémoire. La seule raison pour laquelle vous en avez besoin est d’obtenir l’extension ForEach() , ce qui ne vous épargne en rien une boucle foreach normale. De plus, bien que je ne sois pas un expert dans ce domaine, je dois comprendre que l'extension ForEach() est un style fonctionnel médiocre, car elle suppose presque que vous causez des effets secondaires (un gros non-non fonctionnel). Comme linq est fortement inspiré par le paradigme de la programmation fonctionnelle, j'essaie de faire attention à ce genre de choses.

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

Réponse populaire

Where(td.Attributes[0].Value != "rating-col")) devrait Where(td.Attributes[0].Value != "rating-col")) un lambda ... comme:

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




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi