HTMLAgilityPack의 도움으로 html <tr>
태그에서 datatable을 채우기 위해 다음 LINQ를 작성했습니다. 각 태그는 하나의 속성을 가지고 있으며 속성 값이 "rating-col"인 경우 해당 태그의 innertext
를 무시해야합니다.
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
절?
당신이 람다를 놓친 것처럼 보이고 선택 중 하나가 고장난 것 같습니다. 또한 여기에는 ToList()
또는 ForEach()
대한 이유가 없습니다. ToList()
호출을 사용하면 작업 속도가 느려지고 더 많은 메모리를 사용해야했습니다. 당신이 필요로하는 유일한 이유는 ForEach()
확장을 얻는 것이고 이것은 정상적인 foreach
루프를 통해 여기에 아무것도 저장하지 않는다는 것입니다. 게다가, 나는 그 분야의 전문가는 아니지만 ForEach()
확장은 부작용 (큰 기능적 no-no)을 일으키는 것으로 거의 가정하기 때문에 확장 기능이 좋지 않음을 이해해야합니다. 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"))