LINQ Где синтаксис

c# html-agility-pack linq

Вопрос

У меня есть следующая LINQ, чтобы заполнить datatable из тегов html <tr> с помощью HTMLAgilityPack, каждый тег имеет один атрибут, и мне нужно игнорировать 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 ?

Принятый ответ

Похоже, что вам не хватало лямбда и что один из Selects был не в порядке. Кроме того, для 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);
}

Популярные ответы

Where(td.Attributes[0].Value != "rating-col")) должен иметь в себе лямбда ... например:

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



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow