我可以通过索引引用LINQ结果集中的项吗?

时间:2012-05-20 23:45:32

标签: linq html-agility-pack

我正在尝试使用html agility pack检索的4个表的LINQ结果集。我想通过为每个(下面的switch语句)设置一个变量,然后处理表中的行来稍微区别地处理每一个。理想情况下,该变量是集合03中每个表的索引,并且将在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.
    }
}

1 个答案:

答案 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文档中存储您的评分更改类型?在业务逻辑中定义表信息似乎很奇怪。