我正在尝试使用html agility pack检索的4个表的LINQ结果集。我想通过为每个(下面的switch语句)设置一个变量,然后处理表中的行来稍微区别地处理每一个。理想情况下,该变量是集合0
到3
中每个表的索引,并且将在switch语句中使用并选择行。我无法找到索引属性,但我发现它在SelectChildNode
等情况下使用。
我的问题是我可以通过索引引用LINQ结果集中的项吗?我的“理想情景”是最后一个注释掉的行。提前谢谢。
var ratingsChgs = from table in htmlDoc.DocumentNode
.SelectNodes("//table[@class='calendar-table']")
.Cast<HtmlNode>()
select table;
String rtgChgType;
for (int ratingsChgTbl = 0; ratingsChgTbl < 4; ratingsChgTbl++)
{
switch (ratingsChgTbl)
{
case 0:
rtgChgType = "Upgrades";
break;
case 1:
rtgChgType = "Downgrades";
break;
case 2:
rtgChgType = "Coverage Initiated";
break;
case 3:
rtgChgType = "Coverage Reit/ Price Tgt Changed";
break;
//This is what I'd like to do.
var tblRowsByChgType = from row in ratingsChgs[ratingsChgTbl]
.SelectNodes("tr")
select row;
//Processing of returned rows.
}
}
答案 0 :(得分:2)
ElementAt执行您要求的内容。不过,我建议您不要在示例中使用它,因为each time you call it, your initial LINQ query will be executed。简单的解决方法是将ratingsChgs设为List或Array。
您还可以重构switch语句。当您只需要遍历项目列表时,这就太过分了。这是一个可能的解决方案:
var ratingsChgs = from table in htmlDoc.DocumentNode
.SelectNodes("//table[@class='calendar-table']")
.Cast<HtmlNode>()
select table;
var rtgChgTypeNames = new List
{
"Upgrades",
"Downgrades",
"Coverage Initiated",
"Coverage Reit/ Price Tgt Changed"
};
var changeTypes = ratingsChgs.Zip(rtgChgTypeNames, (changeType, name) => new
{
Name = name,
Rows = changeType.SelectNodes("tr")
});
foreach( var changeType in changeTypes)
{
var name = changeType.Name;
var rows = changeType.Rows;
//Processing of returned rows.
}
另外,为什么不在HTML文档中存储您的评分更改类型?在业务逻辑中定义表信息似乎很奇怪。