LINQ Where Sintassi

c# html-agility-pack linq

Domanda

Ho il seguente LINQ per riempire un datatable dai <tr> html <tr> con l'aiuto di HTMLAgilityPack, ogni tag ha un attributo e ho bisogno di ignorare il innertext di quel tag se il valore dell'attributo è "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));

senza la clausola Where funzionano bene, cosa sto sbagliando all'interno della clausola Where ?

Risposta accettata

Sembra che tu abbia perso un lambda e che uno dei Selects fosse fuori uso. Inoltre, non c'era alcun motivo per ToList() o ForEach() qui. La tua chiamata a ToList() reso le cose più lente e ti ha costretto a usare più memoria. L'unica ragione per cui hai bisogno è di ottenere l'estensione ForEach() , e questo in realtà non ti fa risparmiare nulla su un ciclo foreach normale. Inoltre, anche se non sono un esperto in quell'area, mi viene dato di capire che l'estensione ForEach() è di scarso stile funzionale, perché quasi si presume che tu stia causando effetti collaterali (un grande no-no funzionale). Dal momento che linq è fortemente ispirato al paradigma della programmazione funzionale, cerco di prestare attenzione a queste cose.

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

Risposta popolare

Where(td.Attributes[0].Value != "rating-col")) dovrebbe avere un lambda in esso ... come ad esempio:

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



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché